XPathSelectElements返回null

mat*_*esh 0 c# xml xpath xmldocument

加载函数已在xmlData类中定义

public class XmlData
{
    public void Load(XElement xDoc)
    {
        var id = xDoc.XPathSelectElements("//ID");
        var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS");
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是从我的角度调用Load函数.

            XmlData aXmlData = new XmlData();

            string input, stringXML = "";
            TextReader aTextReader = new StreamReader("D:\\test.xml");
            while ((input = aTextReader.ReadLine()) != null)
            {
                stringXML += input;
            }
            XElement Content = XElement.Parse(stringXML);
            aXmlData.Load(Content);
Run Code Online (Sandbox Code Playgroud)

在加载函数中,即时获取id和listIds为null.

我的test.xml包含

<SEARCH>
  <ID>11242</ID>
  <Lists>
    <List CURRENT="true" AGGREGATEDCHANGED="false">
      <ListIDS>
        <ListID>100567</ListID>
        <ListID>100564</ListID>
        <ListID>100025</ListID>
        <ListID>2</ListID>
        <ListID>1</ListID>
      </ListIDS>
    </List>
  </Lists>
</SEARCH>
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

编辑:您的示例XML 不会有一个id与命名空间元素nss的别名.这将是<nss:id>在这种情况下,或有会是一个默认的命名空间设置.我认为这个答案是,在现实中,你正在寻找的元素在命名空间.

您的查询正在尝试查找id在根级别调用的元素.要查找所有 id元素,您需要:

var tempId = xDoc.XPathSelectElements("//nss:id", ns);
Run Code Online (Sandbox Code Playgroud)

......虽然我亲自使用:

XDocument doc = XDocument.Parse(...);
XNamespace nss = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner";
// Or use FirstOrDefault(), or whatever...
XElement idElement = doc.Descendants(nss + "id").Single();
Run Code Online (Sandbox Code Playgroud)

(我更喜欢在LINQ to XML类型而不是XPath上使用查询方法...我发现更容易避免愚蠢的语法错误等)

您的示例代码也不清楚,因为您正在使用xDoc尚未声明...它有助于编写完整的示例,理想情况下包括编译和作为控制台应用程序运行所需的所有内容.