繁体   English   中英

在XML文件中添加新节点

[英]Add new node in XML file

我有一个具有如下结构的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,则您的节点将作为根节点的最后一个子节点追加,这是预期的行为。

实际上,您实际上想使用w元素单词包装RegDef节点内,这并不像示例中包含的三行代码那么简单。

为此,您需要:

  1. 选择该节点(DOM中有很多方法, document.getElementsByTagName("RegDef")将为您提供包含所有这些方法的NodeList 。您也可以使用XPath。
  2. 对于每个RegDef您需要选择其所有后代文本节点。 如果您使用XPath,则每个RegDef上下文中的表达式如.//text()将为您提供这些节点的列表。 每个可能包含一个或多个“单词”,甚至是空白和换行符。
  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)方法。

更新 :您询问了有关在后续问题中标记内容的问题 ,该问题包含wrapWordsInContents(Element e, Document doc)方法。 调用该方法并使用以下方法序列化上面的代码后:

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

您将获得与预期相似的结果。 请参阅您的后续问题: 修改XML标签的文本内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM