我有一个包含以下数据的XML文件,
<extcode Type="abc" Code="12345" />
我希望能够为Type为abc的行提取代码,即12345。我试过了
XPathSelectElements("Type[@name='abc']")
但它没有返回任何内容。
感谢。
编辑我发现问题出在命名空间上。 XML文件类似于aw:extcode
,而不仅仅是extcode
,这导致查询无法正常工作。我应该如何在命名空间的存在下做到这一点?当我尝试使用
XmlNameTable nameTable = doc.NameTable;
编译器抱怨它无法解析NameTable。
答案 0 :(得分:3)
使用此XPath://extcode[@Type = 'abc']/@Code
答案 1 :(得分:2)
我个人使用LINQ to XML作为我使用XML数据的首选方式。像这样:
XDocument doc = XDocument.Load("test.xml");
int code = doc.Descendants("extCode")
.Where(x => (string) x.Attribute("Type") == "abc")
.First()
.Attribute("Code");
您的XPath无法正常工作的一个原因可能是该属性被称为“类型”而不是“名称”但是...
答案 2 :(得分:0)
XDocument doc = XDocument.Load("test.xml");
var x = doc.Root.XPathSelectElement("./extcode[@Type='abc']");
Console.WriteLine("x:" + x.ToString());
答案 3 :(得分:0)
XDocument xmlDoc = XDocument.Load(Server.MapPath("~/FolderName/FileName.xml"));
var output= from obj in xmlDoc.Element("extcode")
where obj.Attribute("Type").Value.ToLower() == "abc"
select obj;
DataTable outputTable = new DataTable();
outputTable.Columns.Add(new DataColumn("code"));
foreach (var item in output)
{
DataRow outputRows = outputTable.NewRow();
if (outputRows != null)
{
outputRows["Code"] = item.Element("code").Value;
}
}
outputTable.Rows.Add(problemsRows);
outputTable.AcceptChanges();
现在我们有输出数据表,您可以根据需要使用数据。
答案 4 :(得分:0)
编辑我发现问题是 与命名空间。 XML文件就像 aw:extcode而不仅仅是extcode和 导致查询无效 正常。我应该怎么做呢 是否存在命名空间?
编写要应用于带有名称空间的XML文档的XPath表达式是关于XPath的最常见问题之一。
使用XmlNode.SelectNodes()
作为第二个参数的XmlNamespaceManager重载。
第一个链接页面有一个完整的代码示例,适合您的情况。
替代方法是使用 XPathNavigator.Evaluate() 或 XPathNavigator.Select() 重载作为第二个参数 IXmlNamespaceResolver 强>
使用LINQ,您可以使用 Extensions.XPathEvaluate() 方法。