gpt4 book ai didi

java - 使用 XMLStreamWriter 更新 XML

转载 作者:数据小太阳 更新时间:2023-10-29 02:30:47 29 4
gpt4 key购买 nike

我有一个很大的 XML,我想更新 XML 的特定节点(比如删除重复节点)。

由于 XML 很大,我考虑使用 STAX api 类 - XMLStreamReader。我首先使用 XMLStreamReader 读取 XML。我将读取的数据存储在用户对象中,并操作这些用户对象以删除重复项。

现在我想将这个更新后的用户对象放回到我原来的 XML 中。我的想法是,我可以将用户对象编码为一个字符串,并将该字符串放在输入 xml 中的正确位置。但是我无法使用 STAX 类 - XMLStreamWriter 实现它

这可以使用 XMLStreamWriter 实现吗?请建议。如果否,他们请提出解决我的问题的替代方法。

我主要担心的是内存,因为我无法将如此庞大的 XML 加载到我们项目服务器的内存中,该内存在多个进程之间共享。因此我不想使用 DOM,因为这会占用大量内存来加载这些巨大的 XML。

最佳答案

如果您需要更改文本内容/标签名称等特定值,STAX 可能会有所帮助。它还有助于使用 createFilteredReader 删除一些元素

下面的代码将 Name 重命名为 AuthorName 并添加了注释

public class StAx {
public static void main(String[] args) throws FileNotFoundException,
XMLStreamException {

String filename = "HelloWorld.xml";

try (InputStream in = new FileInputStream(filename);
OutputStream out = System.out;) {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLOutputFactory xof = XMLOutputFactory.newInstance();
XMLEventFactory ef = XMLEventFactory.newInstance();

XMLEventReader reader = factory.createXMLEventReader(filename, in);
XMLEventWriter writer = xof.createXMLEventWriter(out);

while (reader.hasNext()) {
XMLEvent event = (XMLEvent) reader.next();
if (event.isCharacters()) {
String data = event.asCharacters().getData();
if (data.contains("Hello")) {
String replace = data.replace("Hello", "Oh");
event = ef.createCharacters(replace);
}
writer.add(event);
} else if (event.isStartElement()) {
StartElement s = event.asStartElement();
String tagName = s.getName().getLocalPart();
if (tagName.equals("Name")) {
String newName = "Author" + tagName;
event = ef.createStartElement(new QName(newName), null,
null);
writer.add(event);
writer.add(ef.createCharacters("\n "));
event = ef.createComment("auto generated comment");
writer.add(event);
} else {
writer.add(event);
}
} else {
writer.add(event);
}
}
writer.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}

输入

<?xml version="1.0"?>
<BookCatalogue>
<Book>
<Title>HelloLord</Title>
<Name>
<first>New</first>
<last>Earth</last>
</Name>
<ISBN>12345</ISBN>
</Book>
<Book>
<Title>HelloWord</Title>
<Name>
<first>New</first>
<last>Moon</last>
</Name>
<ISBN>12346</ISBN>
</Book>
</BookCatalogue>

输出

<?xml version="1.0"?><BookCatalogue>
<Book>
<Title>OhLord</Title>
<AuthorName>
<!--auto generated comment-->
<first>New</first>
<last>Earth</last>
</AuthorName>
<ISBN>12345</ISBN>
</Book>
<Book>
<Title>OhWord</Title>
<AuthorName>
<!--auto generated comment-->
<first>New</first>
<last>Moon</last>
</AuthorName>
<ISBN>12346</ISBN>
</Book>
</BookCatalogue>

如您所见,当修改远不止于此时,事情会变得非常复杂,例如根据其他几个节点的状态交换两个节点删除一个节点:删除价格高于平均价格的所有书籍

这种情况下的最佳解决方案是使用 xslt transformation 生成生成的 xml

关于java - 使用 XMLStreamWriter 更新 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18521153/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com