C#XPath找不到任何东西

C#XPath找不到任何东西,c#,xpath,xml-parsing,C#,Xpath,Xml Parsing,我试图使用XPath来选择具有位置值的方面的项目,但目前我甚至尝试选择所有项目都失败了:系统愉快地报告它找到了0个项目,然后返回(相反,节点应该由foreach循环处理)。如果您能帮助我完成最初的查询,或者让XPath正常工作,我将不胜感激 XML <?xml version="1.0" encoding="UTF-8" ?> <Collection Name="My Collection" SchemaVersion="1.0" xmlns="http://schemas.m

我试图使用XPath来选择具有
位置
值的方面的项目,但目前我甚至尝试选择所有项目都失败了:系统愉快地报告它找到了0个项目,然后返回(相反,节点应该由
foreach
循环处理)。如果您能帮助我完成最初的查询,或者让XPath正常工作,我将不胜感激

XML

<?xml version="1.0" encoding="UTF-8" ?>
<Collection Name="My Collection" SchemaVersion="1.0" xmlns="http://schemas.microsoft.com/collection/metadata/2009" xmlns:p="http://schemas.microsoft.com/livelabs/pivot/collection/2009" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FacetCategories>
    <FacetCategory Name="Current Address" Type="Location"/>
    <FacetCategory Name="Previous Addresses" Type="Location" />
</FacetCategories>
    <Items>
        <Item Id="1" Name="John Doe">
            <Facets>
                <Facet Name="Current Address">
                    <Location Value="101 America Rd, A Dorm Rm 000, Chapel Hill, NC 27514" />
                </Facet>
                <Facet Name="Previous Addresses">
                    <Location Value="123 Anywhere Ln, Darien, CT 06820" />
                    <Location Value="000 Foobar Rd, Cary, NC 27519" />
                </Facet>
            </Facets>
        </Item>
    </Items>
</Collection>
这个方法有更多的东西,但因为这就是运行的全部,所以我假设问题就在这里。调用
root.ChildNodes
准确地返回
FaceCategories
Items
,因此我完全不知所措


谢谢你的帮助

根元素有一个名称空间。您需要在查询中添加名称空间解析器并为元素添加前缀

解释了解决方案。我已经修改了你的代码,所以它得到了1个结果

public void countItems(string fileName)
{
    XmlDocument document = new XmlDocument();
    document.Load(fileName);
    XmlNode root = document.DocumentElement;

    // create ns manager
    XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(document.NameTable);
    xmlnsManager.AddNamespace("def", "http://schemas.microsoft.com/collection/metadata/2009");

    // use ns manager
    XmlNodeList xnl = root.SelectNodes("//def:Item", xmlnsManager);
    Response.Write(String.Format("Found {0} items" , xnl.Count));
}

因为在根节点上有一个XML名称空间,所以在XML文档中没有“Item”这样的东西,只有“[namespace]:Item”,所以在使用XPath搜索节点时,需要指定名称空间

如果您不喜欢,可以使用local-name()函数来匹配本地名称(前缀以外的名称部分)为您要查找的值的所有元素。它的语法有点难看,但它可以工作

XmlNodeList xnl = root.SelectNodes("//*[local-name()='Item']");

这篇文章的链接断了。请更换。看起来它不再可用,但Wayback计算机已对其进行备份:
XmlNodeList xnl = root.SelectNodes("//*[local-name()='Item']");