【问题标题】:How to extract XML data如何提取 XML 数据
【发布时间】:2011-07-07 08:32:36
【问题描述】:

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

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

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

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

但它什么也没返回。

谢谢。

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

XmlNameTable nameTable = doc.NameTable;

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

【问题讨论】:

  • 好问题,+1。有关在具有名称空间的 XML 文档上评估 XPath 表达式的几种替代方法的列表,请参阅我的答案。我已经包含了一系列指向相关 MSDN 文档的链接。

标签: c# .net xml xpath


【解决方案1】:

使用这个 XPath://extcode[@Type = 'abc']/@Code

【讨论】:

    【解决方案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 不起作用的一个原因可能是该属性被称为“类型”而不是“名称”...

    【讨论】:

    • +1 for LINQ to XML 是一种以更可表达的方式编写代码的好方法。
    【解决方案3】:

    你可以这样写↓

            XDocument doc = XDocument.Load("test.xml");
            var x = doc.Root.XPathSelectElement("./extcode[@Type='abc']");
            Console.WriteLine("x:" + x.ToString());
    

    【讨论】:

      【解决方案4】:
      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();
      

      现在我们有了输出数据表,您可以在任何需要的地方使用数据。

      【讨论】:

        【解决方案5】:

        编辑我发现问题是 带有命名空间。 XML文件就像 aw:extcode 而不仅仅是 extcode 和 导致查询不起作用 适当地。我应该怎么做 是否存在命名空间?

        编写 XPath 表达式以应用于具有名称空间的 XML 文档是 XPath 最常见的问题之一。

        使用以XmlNamespaceManager 作为第二个参数的XmlNode.SelectNodes() 重载

        第一个链接到的页面有一个适合您的情况的完整代码示例。

        替代方法是使用 XPathNavigator.Evaluate()XPathNavigator.Select() 重载作为第二个参数 IXmlNamespaceResolver

        借助 LINQ,您可以使用 Extensions.XPathEvaluate() 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-27
          • 1970-01-01
          • 2014-05-20
          相关资源
          最近更新 更多