2014-11-19 3 views
0

У меня есть xml, как показано ниже.Удалить строку из xml в соответствии с условием

<?xml version="1.0" encoding="utf-8"?> 
<package date-created="11/4/2014" client-version="blah" system-version="blah"> 
<description /> 
<system> 
<language /> 
</system> 
<res id="blah" name="name" path="path" type="F" mimeType="mimetype-blah"> 
<description /> 
<keywords /> 
<resver id="1690047800" major="50" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
<resver id="1690167421" major="68" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
<resver id="1690176842" major="71" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
</res> 
<res id="blah1" name="name1" path="path1" type="F" mimeType="mimetype-blah1"> 
<description /> 
<keywords /> 
<resver id="1690145841" major="34" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
<resver id="1690161885" major="64" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
<resver id="1690165275" major="66" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
<resver id="1690169108" major="69" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
<resver id="1690175442" major="87" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
</res> 
</package> 

Я хочу, чтобы удалить все <resver> элементов для одного с самым высоким «основным» значением атрибута, за исключением. Например, выше major = "71" является самым высоким в первой группе resver, а major = "87" является самой высокой во второй группе resver. Так общий результат выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<package date-created="11/4/2014" client-version="blah" system-version="blah"> 
<description /> 
<system> 
<language /> 
</system> 
<res id="blah" name="name" path="path" type="F" mimeType="mimetype-blah"> 
<description /> 
<keywords /> 
<resver id="1690176842" major="71" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
</res> 
<res id="blah1" name="name1" path="path1" type="F" mimeType="mimetype-blah1"> 
<description /> 
<keywords /> 
<resver id="1690175442" major="87" minor="0" revision="0" effective-from="20010101000000" effective-to="20991231235959" workflow-step="1000" /> 
</res> 
</package> 

Я думал использовать JAXB, чтобы сделать работу. Есть ли лучший способ решить эту проблему? Можно ли это сделать с помощью простого Java-файла api?

Ответ
Я написал эту вещь с помощью JAXB, чтобы добиться этого. Вот код

 try { 

     File file = new File(FILE); 
     JAXBContext jaxbContext = JAXBContext.newInstance(Package.class); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     Package pack = (Package) jaxbUnmarshaller.unmarshal(file); 
     if (pack.getRes() == null || pack.getRes().size() == 0) { 
      System.out.println("Size zero - exit"); 
      return; 
     } 
     for (Package.Res res : pack.getRes()) { 
      if (! (res.getResver().size() == 1)) { 
       Short max = getMaxMajorVersion(res); 
       List<Package.Res.Resver> resverList = removeNonMaxResver(res, max); 
       for (Package.Res.Resver resver : resverList) 
        res.getResver().remove(resver); 
      } 
     } 
     finalPack = pack; 
    } catch (JAXBException e) { 
     e.printStackTrace(); 
    } 
    marshal(); 

Метод: extractNonMaxResver

 private static List<Package.Res.Resver> removeNonMaxResver(
     Package.Res res, Short max) { 
    List<Package.Res.Resver> resverList = new ArrayList<Package.Res.Resver>(); 
    for (Package.Res.Resver resver : res.getResver()) { 
     if (resver.getMajor() != max) 
      resverList.add(resver); 
    } 
    return resverList; 
} 

Метод: getMaxMajorVersion

 private static Short getMaxMajorVersion(Package.Res res) { 
    List<Short> list = new ArrayList<Short>(); 
    for (Package.Res.Resver resver : res.getResver()) { 
     list.add(resver.getMajor()); 
    } 
    Short max = Collections.max(list); 
    System.out.println("Max: " + max); 
    return max; 
} 

Метод: предводитель

 public static void marshal() { 
    try { 

     File file = new File(FILE_OUT); 
     JAXBContext jaxbContext = JAXBContext.newInstance(Package.class); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

     // output pretty printed 
     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, 
       Boolean.TRUE); 

     jaxbMarshaller.marshal(finalPack, file); 
     jaxbMarshaller.marshal(finalPack, System.out); 

    } catch (JAXBException e) { 
     e.printStackTrace(); 
    } 

} 

ответ

0

Вы должны загрузить XML в XMLElement или Java-объект (используя JAXB или другую библиотеку lib). Если вы используете XMLEement, вы будете выполнять итерацию через узлы и удаление в соответствии с вашим условием. и в случае объекта Java Model просто перейдите в список, удалив их, а затем сохраните ту же модель, что и файл XML. Пройдите через Java-документы: https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Element.html У этого есть все API, которые вы можете использовать для управления XML.

0

XML не является языком программирования.

Вы не можете добавлять на него условия, но то же самое возможно с такими языками обработки, как XSLT.

<xsl:if test="@foo='bar'"> 
    <xsl:text>Hello, world!</xsl:text> 
</xsl:if> 

Я предлагаю, что это лучший способ сделать этот вид операций.

Другие возможные операции: разбор XML-строки с использованием основных операций со строками. Его сложная и запутанная и более склонная к ошибкам.

Ref This

Смежные вопросы