Xml搜索节点问题

时间:2012-07-31 15:16:21

标签: c# xml

我有以下XML结构:

<html xmlns ="http://www.w3.org/1999/xhtml" >
 <head>
  . .
 </head>
 <body>
  <div id="1"></div>
  <div id="2"></div>
 </body>
</html>

我使用linq to xml来访问id =“2”的div。我在XDocument中加载了文档:

   XDocument  ndoc = XDcoument.load(path);
   XElement n = new XElement("name","value");
   XNamespace xn = "http://www.w3.org/1999/xhtml";

ndoc.Descendants(xn + "div").Single(p => p.Attribute("id").Value == "1").Add(n);

                             OR

ndoc.Descendants("div").Single(p => p.Attribute("id").Value == "1").Add(n);

我尝试了两种情况,每种情况都有一个不包含任何元素的异常序列。问题是什么?

4 个答案:

答案 0 :(得分:0)

这应该有效

XNamespace xn = XNamespace.Get("http://www.w3.org/1999/xhtml");
ndoc.Descendants(xn + "div").Single(p => p.Attribute("id").Value == "1").Add(n);

答案 1 :(得分:0)

这将有效

XDocument ndoc =XDcoument.load(path);
XElement n = new XElement("name", "value");
XNamespace xn = "http://www.w3.org/1999/xhtml";

var item = ndoc.Descendants(xn + "div").FirstOrDefault(p => p.Attribute("id").Value == "1");
if(item!=null)
    item.Add(n);

使用Single方法,如果您确定表达式中只有一个元素出现。如果有任何机会,可能会有多个元素出现,请使用FirstOrDefault()

请记住,Descendants()将为您提供来自任何子级别(儿童,大孩子等)的匹配条件的所有元素。

Elements()方法只会给你立即(直接)孩子。

请仔细使用。

答案 2 :(得分:0)

对我来说,你的例子(有点修改)工作正常:

 var xml = @"<html xmlns ='http://www.w3.org/1999/xhtml' >
 <head>
 </head>
 <body>
  <div id='1'></div>
  <div id='2'></div>
 </body>
</html>";
            XDocument xd = XDocument.Parse(xml);

            XElement n = new XElement("name", "value");
            XNamespace xn = "http://www.w3.org/1999/xhtml";

            xd.Descendants(xn + "div").Single(p => p.Attribute("id").Value == "1").Add(n);

            Console.WriteLine(xd);

输出

<html xmlns="http://www.w3.org/1999/xhtml">
  <head></head>
  <body>
    <div id="1">
      <name xmlns="">value</name>
    </div>
    <div id="2"></div>
  </body>
</html>

所以我真的不明白你的问题。请检查您是否复制了所有正确的=)

答案 3 :(得分:0)

你可以给这个Xml Library一个旋转,它应该很容易用:

XElement root = XElement.Load(path);
XElement div = root.XPathElement("//div[@id={0}]", 1);
if(null != div) // which it shouldn't be
    div.Add(n);