3

我有以下 xml

 <root>
    <data>
      <person>tewst</person>
      <data>
        <phone>djk</phone>
        <email>dsd</email>
      </data>
    </data>
  </root>

使用 c# SelectSingleNode 我试图到达第二个“数据”节点并在电子邮件标签之后插入新元素调用“phone2”。问题是我无法访问正确的“数据”节点。这是我用来到达那里的代码,它不起作用。任何帮助,将不胜感激。谢谢

XMLDocument doc = new XMLDocument("xml file here");
var node = doc.SelectSingleNode("//data[last()]");

XMLElement phone1 = doc.CreateElement("phone2");
phone1.InnerText = "12";
node.AppendChild(phone1);

问题是节点为空。

解决方案:

XMLDocument doc = new XMLDocument("xml file here");
var node = doc.SelectSingleNode("(//data)[last()]");
4

2 回答 2

4

//data[last()]选择data作为其父级的最后一个data子节点的节点,因此它在您的示例中选择 2 个节点:

1) 节点的最后一个dataroot节点

<data>
    <person>tewst</person>
    <data>
        <phone>djk</phone>
        <email>dsd</email>
    </data>
</data>

2) 和data第一个节点的最后一个子data节点

<data>
    <phone>djk</phone>
    <email>dsd</email>
</data>

要选择data整个文档中的最后一个,请使用:

(//data)[last()]
  • //data将为所有后代data元素生成节点集,无论是否嵌套,
  • [last()]将选择节点集的最后一个节点
  • 用括号括()起来//data,它确保它被解释为//datathen [last()],而不是 //thendata[last()]
于 2013-08-31T11:20:03.080 回答
1

有几种不同的方法可以做到这一点。

(1) 如果您知道 XML 的结构将始终如上 - “根”元素,正好有一个“数据”子元素,并且在“数据”父元素下正好有一个“数据”子元素,您可以访问第二个"data" 元素直接使用 XPath 表达式:

XmlNode node = doc.SelectSingleNode("/root/data/data");

(2) 如果“根”元素下面有多个“数据”元素,则可以执行以下操作:

XmlNodeList nodeList = doc.SelectNodes("//data/data");

此 XPath 表达式将返回文档中每个顶级“数据”元素下方的第一个“数据”元素。例如,如果您有一个这样的 XML 文档:

<root>
    <data>
      <person>tewst</person>
      <data>
        <phone>djk</phone>
        <email>dsd</email>
      </data>
    </data>
    <data>
      <person>two</person>
       <data>
        <phone>bbb</phone>
        <email>ddd</email>
       </data>
    </data>
</root>

...这段代码的输出被剪断了:

XmlNodeList nodeList = doc.SelectNodes("//data/data");

foreach (XmlNode parentData in nodeList)
    Console.WriteLine(parentData.InnerXml.ToString());

...将产生:

<phone>djk</phone><email>dsd</email>
<phone>bbb</phone><email>ddd</email>

希望这可以帮助。

于 2013-08-31T01:08:59.710 回答