LINQ to XML Select语句 - 无结果

时间:2011-07-28 16:02:32

标签: c# .net xml linq linq-to-xml

  

可能重复:
  Parse XML Elements with LINQ

我有一个XML文档,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<TestDataset xmlns="http://tempuri.org/TestDataset.xsd">
  <TaxRate>
    <Code>GST</Code>
    <Rate>0.05</Rate>
    <LastModified>2010-03-31T17:03:24.063-04:00</LastModified>
    <Deleted>0</Deleted>
    <AbbreviationEN>GST</AbbreviationEN>
    <AbbreviationFR>GST</AbbreviationFR>
    <GLSubCode>GST</GLSubCode>
  </TaxRate>
  <TaxRate>
    <Code>PST</Code>
    <Rate>0.08</Rate>
    <LastModified>2010-03-31T17:03:24.063-04:00</LastModified>
    <Deleted>0</Deleted>
    <AbbreviationEN>PST</AbbreviationEN>
    <AbbreviationFR>PST</AbbreviationFR>
    <GLSubCode>PST</GLSubCode>
  </TaxRate>
</TestDataset>

我正在尝试使用以下查询选择它的内容:

XDocument data = LoadTestData("TaxRate.xml");
var taxdata = (from x in data.Elements("TaxRate")
              select new
              {
                  Code = x.Element("Code").Value,
                  Rate = x.Element("Rate").Value,
                  AbbreviationEN = x.Element("AbbreviationEN").Value,
                  AbbreviationFR = x.Element("AbbreviationFR").Value,
                  GLSubCode = x.Element("GLSubCode").Value
               }).ToList();

但是我一直没有得到任何结果,LoadTestData正在加载XML文档。

2 个答案:

答案 0 :(得分:4)

您忘记包含命名空间:

XNamespace ns = "http://tempuri.org/TestDataset.xsd";
XDocument data = LoadTestData("TaxRate.xml");
var taxdata = (from x in data.Descendants(ns + "TaxRate")
              select new
              {
                  Code = x.Element(ns + "Code").Value,
                  Rate = x.Element(ns + "Rate").Value,
                  AbbreviationEN = x.Element(ns + "AbbreviationEN").Value,
                  AbbreviationFR = x.Element(ns + "AbbreviationFR").Value,
                  GLSubCode = x.Element(ns + "GLSubCode").Value
               }).ToList();

虽然XML文件中的命名空间是默认命名空间,但您仍需要将其包含在查询中。

答案 1 :(得分:3)

您必须尊重命名空间:

XNamespace ns = "http://tempuri.org/TestDataset.xsd";
var taxdata = (from x in data.Elements(ns+"TaxRate")
          select new
          {
              Code = x.Element(ns+"Code").Value,
              Rate = x.Element(ns+"Rate").Value,
              AbbreviationEN = x.Element(ns+"AbbreviationEN").Value,
              AbbreviationFR = x.Element(ns+"AbbreviationFR").Value,
              GLSubCode = x.Element(ns+"GLSubCode").Value
           }).ToList();