как удалить пустые теги во входе xml

Мой модуль Java получает огромный вход xml от мейнфрейма. К сожалению, мейнфрейм не может пропустить дополнительные элементы, так что в итоге я получаю МНОГО пустых тегов в моем входе:

Так,

<SSN>111111111</SSN>
<Employment>
<Current>
<Address>
<line1/>
<line2/>
<line3/>
<city/>
<state/>
<country/>
</Address>
<Phone>
<phonenumber/>
<countryCode/>
</Phone>
</Current>
<Previous>
<Address>
<line1/>
<line2/>
<line3/>
<city/>
<state/>
<country/>    
</Address>
<Phone>
<phonenumber/>
<countryCode/>
</Phone>
</Previous>
</Employment>
<MaritalStatus>Single</MaritalStatus>

должен быть:

<SSN>111111111</SSN>
<MaritalStatus>SINGLE</MaritalStatus>

Я использую jaxb для неМаршалла вход xml строка, что мейнфрейм отправляет его. Есть ли чистый / простой способ удалить все пустые теги группы, или сделать я должен сделать это руководство в коде для каждого элемента. У меня есть более чем 350 элементов в моем входе xml, таким образом, я любил бы к нему, если сам jaxb имел способ сделать это автоматически?

Спасибо, SGB

5
задан SGB 21 May 2010 в 18:18
поделиться

3 ответа

Вы можете выполнить предварительную обработку с помощью XSLT. Я знаю, что в наши дни это считается чем-то вроде «дискотеки», но его легко и быстро применить.

Из этого обсуждения tek-tips вы можете преобразовать с помощью XSLT, чтобы удалить пустые элементы.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:if test=". != '' or ./@* != ''">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
4
ответ дан 13 December 2019 в 22:02
поделиться

Я думаю, вам придется отредактировать код вашего мэйнфрейма, чтобы найти лучшее решение. Когда ваш мэйнфрейм генерирует XML, вам нужно указать ему не выводить тег, если он пуст.

Я не думаю, что на стороне клиента много чего можно сделать. Если полученный XML заполнен пустыми тегами, тогда у вас нет другого выбора, кроме как проанализировать их все - в конце концов, как вы можете определить, пуст ли тег, не проанализировав его каким-либо образом!

Но, возможно, вы могли бы заменить строку регулярного выражения в тексте XML до того, как JAX-B доберется до него:

String xml = //get the XML
xml = xml.replaceAll("<.*?/>", "");

Это удалит пустые теги, такие как «», но не «

» .

4
ответ дан 13 December 2019 в 22:02
поделиться

Единственный метод, который я знаю в JAXB, чтобы сделать это, - это написать собственный XmlAdapter , который сворачивает ваши пустые строки в пустые значения.

Обратной стороной является то, что вам придется добавить это как аннотацию к каждому элементу вашего кода, а если у вас их 350, это будет утомительно.

1
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: