XPathSelectElements returns null
本文关键字:null returns XPathSelectElements | 更新日期: 2023-09-27 18:18:18
加载函数已经在xmlData类中定义
public class XmlData
{
public void Load(XElement xDoc)
{
var id = xDoc.XPathSelectElements("//ID");
var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS");
}
}
我只是从我的端调用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);
在加载函数,我得到两个id和和listIds为空。
My 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>
编辑:您的示例XML 没有在名称空间中具有nss
别名的id
元素。在这种情况下,它将是<nss:id>
,或者设置一个默认名称空间。对于这个答案,我假设实际上您要查找的元素是名称空间中的。
您的查询试图在根级别找到一个名为id
的元素。要查找所有 id
元素,您需要:
var tempId = xDoc.XPathSelectElements("//nss:id", ns);
…虽然我个人会用:
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();
(我更喜欢使用LINQ上的查询方法到XML类型,而不是XPath…我发现它更容易避免愚蠢的语法错误等)
你的示例代码也不清楚,因为你使用的xDoc
还没有被声明…它有助于编写完整的示例,理想情况下包括作为控制台应用程序编译和运行所需的所有内容。
我正在看问题提交3小时后,41分钟后,它是(最后)编辑。
所提供的XML文档中没有定义名称空间。
var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS");
这个XPath表达式显然没有从提供的XML文档中选择任何节点,因为XML文档没有名为Lists
的顶部元素(实际顶部元素的名称是SEARCH
)
var id = xDoc.XPathSelectElements("//ID");
在加载函数,我得到两个id和和listIds为空。
此语句为假,因为//ID
选择了所提供的XML文档中唯一名为ID的元素,因此c#变量id
的值是非空的。可能您在编辑XML文档之后没有进行彻底的测试。
很可能原来的ID
元素属于某个命名空间。但是现在它在"no namespace"中,并且上面的XPath表达式选择了它。
string xmldocument = "<response xmlns:nss='"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner'"><action>test</action><id>1</id></response>";
XElement Content = XElement.Parse(xmldocument);
XPathNavigator navigator = Content.CreateNavigator();
XmlNamespaceManager ns = new XmlNamespaceManager(navigator.NameTable);
ns.AddNamespace("nss", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
var tempId = navigator.SelectSingleNode("/id");
空值或系统返回值的原因是由于以下
var id = xDoc.XPathSelectElements("//ID");
XpathSElectElements是system .xml.linq. xelement,它是linq查询日期。它不能直接输出。获取单个的第一个匹配元素使用XPathSelectElement("//ID");可以使用XPathSelectElements作为
检查出现的次数var count=xDoc.XPathSelectElements("//ID").count();
您还可以使用特定条件
按顺序查询linq语句为了从列表中获取节点值,你可以使用
foreach (XmlNode xNode in xDoc.SelectNodes("//ListIDS/ListID"))
{
Console.WriteLine(xNode.InnerText);
}
对于第二个列表,因为没有得到值,所以列表项的XPath不正确