我有一个 XML 例如
<?xml version="1.0" encoding="utf-8"?>
<A1>
<B2>
<C3 id="1">
<D7>
<E5 id="abc" />
</D7>
<D4 id="1">
<E5 id="abc" />
</D4>
<D4 id="2">
<E5 id="abc" />
</D4>
</C3>
</B2>
</A1>
这是示例代码:
var xDoc = XDocument.Load("Test.xml");
string xPath = "//B2/C3/D4";
//or string xPath = "//B2/C3/D4[@id='1']";
var eleList = xDoc.XPathSelectElements(xPath).ToList();
foreach (var xElement in eleList)
{
Console.WriteLine(xElement);
}
它工作得很好,但是如果我向根节点 A1 添加命名空间,则此代码不起作用。
在寻找解决方案时,我找到了this,但它使用Descendants()方法来查询XML。根据我的理解,如果我搜索
我的要求是搜索特定 XPath 中是否存在节点。如果有一种方法可以使用后代来做到这一点,我会很高兴使用它。如果没有,请指导我如何使用名称空间进行搜索。
如果这是重复的,我深表歉意。
要继续使用 XPath,您可以使用以下链接:
var xDoc = XDocument.Parse(@"<?xml version='1.0' encoding='utf-8'?>
<A1 xmlns='urn:sample'>
<B2>
<C3 id='1'>
<D7><E5 id='abc' /></D7>
<D4 id='1'><E5 id='abc' /></D4>
<D4 id='2'><E5 id='abc' /></D4>
</C3>
</B2>
</A1>");
// Notice this
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("sample", "urn:sample");
string xPath = "//sample:B2/sample:C3/sample:D4";
var eleList = xDoc.XPathSelectElements(xPath, nsmgr).ToList();
foreach (var xElement in eleList)
{
Console.WriteLine(xElement);
}
但它使用 Descendants() 方法来查询 XML。根据我的理解,如果我搜索,这个解决方案将会失败,因为 , 和
存在相同的标签
我很确定你不太明白它是如何工作的。来自MSDN文档:
按文档顺序返回此文档或元素的后代元素的过滤集合。集合中仅包含具有匹配 XName 的元素。
所以对于你的情况,只需这样做:
xDoc.RootNode
.Descendants("E5")
.Where(n => n.Parent.Name.LocalName == "B4");
试试这个
var xDoc = XDocument.Parse("<A1><B2><C3 id=\"1\"><D7><E5 id=\"abc\" /></D7><D4 id=\"1\"><E5 id=\"abc\" /></D4><D4 id=\"2\"><E5 id=\"abc\" /></D4></C3></B2></A1>");
foreach (XElement item in xDoc.Element("A1").Elements("B2").Elements("C3").Elements("D4"))
{
Console.WriteLine(item.Element("E5").Value);//to get the value of E5
Console.WriteLine(item.Element("E5").Attribute("id").Value);//to get the value of attribute
}