Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ的嵌套XML解析_C#_Xml_Linq - Fatal编程技术网

C# 使用LINQ的嵌套XML解析

C# 使用LINQ的嵌套XML解析,c#,xml,linq,C#,Xml,Linq,我有以下XML文档: <?xml version="1.0" encoding="utf-8" ?> <Tax> <TaxCategory> <TaxCategoryType>Single</TaxCategoryType> <TaxRates> <Rate> <From>0</From> <To>8500&l

我有以下XML文档:

<?xml version="1.0" encoding="utf-8" ?>

<Tax>
  <TaxCategory>
    <TaxCategoryType>Single</TaxCategoryType>

    <TaxRates>
      <Rate>
        <From>0</From>
        <To>8500</To>
        <Multiply>0</Multiply>
        <Subtract>0</Subtract>
      </Rate>

      <Rate>
        <From>8501</From>
        <To>14500</To>
        <Multiply>0.15</Multiply>
        <Subtract>1275</Subtract>
      </Rate>

      <Rate>
        <From>14501</From>
        <To>19500</To>
        <Multiply>0.25</Multiply>
        <Subtract>2725</Subtract>
      </Rate>

      <Rate>
        <From>19501</From>
        <To>60000</To>
        <Multiply>0.29</Multiply>
        <Subtract>3505</Subtract>
      </Rate>

      <Rate>
        <From>60001</From>
        <Multiply>0.35</Multiply>
        <Subtract>7105</Subtract>
      </Rate>
    </TaxRates>
  </TaxCategory>

  <TaxCategory>
    <TaxCategoryType>Married</TaxCategoryType>

    <TaxRates>
      <Rate>
        <From>0</From>
        <To>11900</To>
        <Multiply>0</Multiply>
        <Subtract>0</Subtract>
      </Rate>

      <Rate>
        <From>11901</From>
        <To>21200</To>
        <Multiply>0.15</Multiply>
        <Subtract>1785</Subtract>
      </Rate>

      <Rate>
        <From>21201</From>
        <To>28700</To>
        <Multiply>0.25</Multiply>
        <Subtract>3905</Subtract>
      </Rate>

      <Rate>
        <From>28701</From>
        <To>60000</To>
        <Multiply>0.29</Multiply>
        <Subtract>5053</Subtract>
      </Rate>

      <Rate>
        <From>60001</From>
        <Multiply>0.35</Multiply>
        <Subtract>8653</Subtract>
      </Rate>
    </TaxRates>
  </TaxCategory>

  <TaxCategory>
    <TaxCategoryType>Parent</TaxCategoryType>

    <TaxRates>
      <Rate>
        <From>0</From>
        <To>9800</To>
        <Multiply>0</Multiply>
        <Subtract>0</Subtract>
      </Rate>

      <Rate>
        <From>9801</From>
        <To>15800</To>
        <Multiply>0.15</Multiply>
        <Subtract>1470</Subtract>
      </Rate>

      <Rate>
        <From>15801</From>
        <To>21200</To>
        <Multiply>0.25</Multiply>
        <Subtract>3050</Subtract>
      </Rate>

      <Rate>
        <From>21201</From>
        <To>60000</To>
        <Multiply>0.29</Multiply>
        <Subtract>3898</Subtract>
      </Rate>

      <Rate>
        <From>60001</From>
        <Multiply>0.35</Multiply>
        <Subtract>7498</Subtract>
      </Rate>
    </TaxRates>
  </TaxCategory>
</Tax>

由于
From
To
标记深深嵌套在
TaxCategory
标记中,我应该放什么来代替注释呢?

您可以按如下方式操作:

var taxCategory = xmlDoc.Descendants("TaxCategory")
    .First(tc => tc.Element("TaxCategoryType").Value == "Single")
    .Descendants("Rate")
    .FirstOrDefault(r => r.Element("From").Value == "0" 
        && r.Element("To").Value == "8500");
更新:
这是我使用查询语法得出的结果(并且只有一个查询):


非常感谢ChrFin:)谢谢ChrFin:)你也知道如何用查询语法重写它吗?我将非常感激。非常感谢。非常感谢ChrFin:)我非常感谢:)@Matthew:请查看我的更新-也许有人知道更好的方法,因为我认为这对于大型XML文件来说可能会很慢…非常感谢ChrFin。我从你的回答中学到了很多:)
var taxCategory = xmlDoc.Descendants("TaxCategory")
    .First(tc => tc.Element("TaxCategoryType").Value == "Single")
    .Descendants("Rate")
    .FirstOrDefault(r => r.Element("From").Value == "0" 
        && r.Element("To").Value == "8500");
var category = (from r in xmlDoc.Descendants("TaxCategory").Descendants("Rate")
        where r.Parent.Parent.Element("TaxCategoryType").Value == "Single"
           && r.Element("From").Value == "0" && r.Element("To").Value == "8500"
        select r).FirstOrDefault();