我有以下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);
我尝试了两种情况,每种情况都有一个不包含任何元素的异常序列。问题是什么?
答案 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);