根据条件从xml中删除行

时间:2014-11-19 04:36:40

标签: java xml file jaxb

我有一个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>个元素。 例如,在第一个resver组中,major =“71”最高,而在第二个resver组中,major =“87”是最高的。 所以整体输出看起来像这样:

<?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来完成这项工作。有没有更好的方法来解决这个问题? 可以使用Simple Java File 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;
}

方法:marshal

     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();
    }

}

2 个答案:

答案 0 :(得分:0)

您需要将XML加载到XMLElement或Java对象中(使用JAXB或其他lib)。如果使用XMLEement,那么您将遍历节点并根据您的条件进行删除。在Java Model对象的情况下,只需遍历列表就删除它们,然后将相同的Model保存为XML文件。 浏览Java文档:https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Element.html 它具有可用于操作XML的所有API。

答案 1 :(得分:0)

XML不是一种编程语言。

你无法在其上添加条件,但使用XSLT等处理语言也是如此。

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

我建议作为进行此类操作的最佳方式。

其他可能的操作是使用基本的String操作解析XML String。它复杂而混乱,更容易出错。

Ref This

相关问题