我有一个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();
}
}
答案 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。它复杂而混乱,更容易出错。