如何提取XML数据

时间:2011-07-07 08:32:37

标签: c# .net xml xpath

我有一个包含以下数据的XML文件,

<extcode Type="abc" Code="12345" />

我希望能够为Type为abc的行提取代码,即12345。我试过了

XPathSelectElements("Type[@name='abc']")

但它没有返回任何内容。

感谢。

编辑我发现问题出在命名空间上。 XML文件类似于aw:extcode,而不仅仅是extcode,这导致查询无法正常工作。我应该如何在命名空间的存在下做到这一点?当我尝试使用

XmlNameTable nameTable = doc.NameTable;

编译器抱怨它无法解析NameTable。

5 个答案:

答案 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() 方法。