在XML文件中添加新节点(Add new node in XML file)

2019-10-20 07:20发布

我有这样一个结构的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标签中的每个字一个节点,然后添加一个属性节点? 谢谢。

Answer 1:

你选择了你的文件的根节点 <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)方法。

更新 :你问到令牌化的内容的后续问题其中包含wrapWordsInContents(Element e, Document doc)方法。 你之后调用该方法,并与序列化上面的代码:

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

你将有类似你所期望的一个结果。 请参阅您的后续问题: 修改XML标签的文本内容



文章来源: Add new node in XML file