как убрать пустые теги во входных XML - PullRequest
5 голосов
/ 21 мая 2010

Мой 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 ]

4 голосов
/ 21 мая 2010

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

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

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

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

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

».
4 голосов
/ 21 мая 2010

Вы можете выполнить предварительную обработку, используя 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>
1 голос
/ 31 мая 2012

Хорошо, случайно зашёл сюда. Простое рабочее решение с jaxb (по крайней мере для jdk 1.6.x):

установить нежелательный атрибут или элемент в ноль! например ... setEmployment (нуль); тогда вся структура занятости исчезнет.

Приветствие Маси

1 голос
/ 23 мая 2010

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

0 голосов
/ 13 сентября 2017
 public static void main(String[] args) {

    final String regex1 = "<([a-zA-Z][a-zA-Z0-9]*)[^>]*/>";
    final String regex2 = "<([a-zA-Z][a-zA-Z0-9]*)[^>]*>\\s*</\\1>";

    String xmlString = "<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>";
    System.out.println(xmlString);

    final Pattern pattern1 = Pattern.compile(regex1);
    final Pattern pattern2 = Pattern.compile(regex2);

    Matcher matcher1;
    Matcher matcher2;
    do {
        matcher1 = pattern1.matcher(xmlString);
        matcher2 = pattern2.matcher(xmlString);
        xmlString = xmlString.replaceAll(regex1, "").replaceAll(regex2, "");
    } while (matcher1.find() || matcher2.find());

    System.out.println(xmlString);
}

Консоль

<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>

Онлайн демо здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...