gpt4 book ai didi

java - 在 XML 文件中添加新节点

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:30 24 4
gpt4 key购买 nike

我有一个结构如下的 xml 文件:

<?xml version="1.0"?>
<entries>
<entry accente="one">
<list>Word</list>
<sense class="0" value="B">
<definition>
<MorfDef>s. m.</MorfDef>
<RegDef>This <i>text</i> have i node.</RegDef>
<ItalMarker>Text.</ItalMarker>
</definition>
</sense>
</entry>
<entry accente="two">
<list>B n-1</list>
<sense class="0" value="B">
<definition>
<MorfDef>s. m.</MorfDef>
<RegDef>This text doesn't have i atribute.</RegDef>
<ItalMarker>Word.</ItalMarker>
</definition>
</sense>
</entry>
</entries>

我想为 RegDef 元素中的每个单词添加一个新节点,因此结果可能是:

<?xml version="1.0"?>
<entries>
<entry accente="one">
<list>Word</list>
<sense class="0" value="B">
<definition>
<MorfDef>s. m.</MorfDef>
<RegDef><w lemma="A1">This</w> <i><w lemma="A2">text</w></i> <w lemma="A3">have</w> <w lemma="A4">i</w> <w lemma="A5">node</w> <w lemma="A6">.</w></RegDef>
<ItalMarker>Text.</ItalMarker>
</definition>
</sense>
</entry>
<entry accente="two">
<list>B n-1</list>
<sense class="0" value="B">
<definition>
<MorfDef>s. m.</MorfDef>
<RegDef><w lemma="A7">This</w> <w lemma="A8">text</w> <w lemma="A8">doesn't</w> <w lemma="A10">have</w> <w lemma="A11">i</w> <w lemma="A12">atribute</w> <w lemma="A13">.</w></RegDef>
<ItalMarker>Word.</ItalMarker>
</definition>
</sense>
</entry>
</entries>

如果 RegDef 节点有一个 < i > 节点,我想从 < i > 节点读取文本并为每个单词写入一个 < w > 节点。我尝试使用 XPath,如下所示:

 Element rootElement = document.getDocumentElement();
Element element = document.createElement("w");
rootElement.appendChild(element);

但它附加在根节点之后。如何为 RegDef 标记中的每个单词编写一个节点,然后向该节点添加属性?谢谢。

最佳答案

您选择了文件的节点 <entries> 。如果您在该节点上使用appendChild,您的节点将被追加为根节点的最后子节点,这是预期的行为。

您实际上想要将单词换行RegDef 内节点 w元素,这不是一个像示例中包含的三行代码那么简单的任务。

为此,您需要:

  1. 选择该节点(DOM 中有很多方法,document.getElementsByTagName("RegDef") 将为您提供包含所有这些方法的 NodeList。您还可以使用 XPath。
  2. 对于每个RegDef您需要选择其所有后代文本节点。如果您使用 XPath 表达式,例如 .//text() 在每个 RegDef 的上下文中 将为您提供这些节点的列表。每一个可能包含一个或多个“单词”,甚至是空格和换行符。
  3. 您可以通过空格、标点符号或其他可用作单词分隔符的字符来分割单词,从而提取单词。。 Java 中有多种工具可以实现这一点,包括正则表达式。
  4. 最后,当您隔离了每个单独的“单词”并消除了要忽略的节点时,您可以创建一个 w对于每个元素,创建一个包含该单词的新文本节点,并将该文本节点附加作为该元素的子元素。您还必须设置属性。

也许您应该使用较小的 XML 文件来专注于您的特定问题,然后将其适应您的实际示例。您可以从这样的事情开始:

String xml = "<nodes>\n"
+ " <RegDef>This <i>text</i> have i node.</RegDef>\n"
+ " <RegDef>This text doesn't have i atribute.</RegDef>\n"
+ "</nodes>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));

NodeList regDefNodes = document.getElementsByTagName("RegDef");
int size = regDefNodes.getLength();
for(int i = 0; i < size; i++) {
Element regDef = (Element)regDefNodes.item(i);
Element newRegDef = wrapWordsInContents(regDef, document);
Element parent = (Element)regDef.getParentNode();
parent.replaceChild(newRegDef, regDef);
}

现在您可以使用上述步骤作为指导并编写 wrapWordsInContents(Element e, Document doc)方法。

更新:您询问了如何对 followup question 中的内容进行标记化 其中包含 wrapWordsInContents(Element e, Document doc)方法。调用该方法并使用以下命令序列化上面的代码后:

Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(document), new StreamResult(System.out));

您将得到与您期望的结果类似的结果。查看您的后续问题:Modify the text content of XML tag

关于java - 在 XML 文件中添加新节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24201168/

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