我在使用C#4.0中的LINQ to XML在Xml文件中查找元素时遇到了麻烦。
这是简化的Xml Schema:
<?xml version="1.0" encoding="utf-8"?>
<mDoc xmlns="http://schemas.microsoft.com/taxonomy/2003/1">
<content>
<gdsPage xmlns="http://mysite.com/schemas/gdsPage/1/">
<textContainer id="C_134572">
<text id="T_399231">Content</text>
<text id="T_399232">Content</text>
</textContainer>
<textContainer id="C_134607" brands="PRMR " did="1" renderOption="" needceiling="0">
<text id="T_399268">Content</text>
</textContainer>
</gdsPage>
</content>
</mDoc>
请注意本文档中定义的两个单独的命名空间。
我在我的代码中定义它们如下:
XNamespace ns_mdoc = "http://schemas.microsoft.com/taxonomy/2003/1";
XNamespace ns_gds = "http://mysite.com/schemas/gdsPage/1/";
然后根据我的理解,我应该能够将命名空间添加到元素上以找到它,如下所示:
var query =
from links in
xdoc.Element(ns_gds + "linkContainer").Elements("link")
where links.Attribute("id").Value == "C_134608" || links.Attribute("id").Value == "L_233140"
select links;
返回null。我尝试了许多其他访问器组合,如Axis搜索和Descendants:
var stuff = from links in xdoc.Descendants(ns_gds + "linkContainer")
select new {
link = links.Element(ns_gds + "link").Value
};
我也试过使用两个名称空格,一个是另一个。还是空的。
我在这里缺少什么?
谢谢你看看。
答案 0 :(得分:1)
这里有几个问题:
您的XML不包含任何内容
linkContainer
或link
元素 -
它们被命名为textContainer
和
text
。
此外,您必须使用Descendands()
如果孩子,而不是Elements()
您要访问的节点不是
直接孩子。
您必须在所有名称上设置名称空间
查询中的元素
在那个命名空间下 - 你是
缺少当前的命名空间
Elements("link")
部分。
使用此XML:
<?xml version="1.0" encoding="utf-8"?>
<mDoc xmlns="http://schemas.microsoft.com/taxonomy/2003/1">
<content>
<gdsPage xmlns="http://mysite.com/schemas/gdsPage/1/">
<textContainer id="C_134572">
<text id="T_399231">Content</text>
<text id="T_399232">Content</text>
</textContainer>
<textContainer id="C_134607" brands="PRMR " did="1" renderOption="" needceiling="0">
<text id="T_399268">Content</text>
</textContainer>
</gdsPage>
</content>
</mDoc>
这对我有用:
var query = from links in xdoc.Descendants(ns_gds + "textContainer")
.Elements(ns_gds + "text")
where links.Attribute("id").Value == "T_399268" ||
links.Attribute("id").Value == "L_233140"
select links;