已在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为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>
答案 0 :(得分:6)
编辑:您的示例XML 在名称空间中具有id
元素并带有nss
别名。在这种情况下,它将是<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 to XML类型的查询方法而不是XPath ...我发现更容易避免愚蠢的语法错误等。)
您的示例代码也不清楚,因为您正在使用尚未声明的xDoc
...它有助于编写完整的示例,理想情况下包括编译和运行所需的所有内容作为控制台应用程序。
答案 1 :(得分:1)
我在提交问题3小时后查看问题,并在编辑完(最后)编辑后41分钟。
提供的XML文档中没有定义名称空间。
var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS");
此XPath表达式显然不会从提供的XML文档中选择任何节点,因为XML文档没有名为Lists
的顶级元素(实际顶部元素的名称为SEARCH
)
var id = xDoc.XPathSelectElements("//ID");
在加载函数中,即时获取id和listIds为null。
此语句为false,因为//ID
在提供的XML文档中选择唯一名为ID的元素,因此C#变量id
的值为非null。可能在编辑XML文档后没有彻底测试。
最有可能原始的ID
元素属于某个命名空间。但现在它处于“无命名空间”,上面的XPath表达式确实选择了它。
答案 2 :(得分:0)
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");
答案 3 :(得分:0)
null值或系统返回值的原因是由于以下
var id = xDoc.XPathSelectElements("//ID");
XpathSElectElements是System.xml.linq.XElment,它是linq查询日期。它不能直接输出。 获取个人第一匹配元素 使用XPathSelectElement(“// ID”); 您可以使用XPathSelectElements检查出现次数为
var count=xDoc.XPathSelectElements("//ID").count();
您还可以使用特定条件
将linq语句作为订单查询为了从列表中获取节点值,您可以使用此
foreach (XmlNode xNode in xDoc.SelectNodes("//ListIDS/ListID"))
{
Console.WriteLine(xNode.InnerText);
}
对于第二个列表,您自己获得了值,列表项的XPath不正确