简体   繁体   中英

Nested XML Parsing using LINQ

I have the following XML document:

<?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>

Now, I want to extract the Multiply and Subtract values for the tax with category type single TaxCategoryType and the tax rate with from == 0 and to == 8500 .

How can I do this with LINQ?

This is what I have done so far:

var taxCategory = from tc in xmlDoc.Descendants("TaxCategory")
    where tc.Element("TaxCategoryType").Value == "Single"
    //and TaxRate.From = 0 && TaxRate.To = 8500
    select tc;

What should I put instead of the comment since the From and To tags are deeply nested within the TaxCategory tag?

You could do it like the following:

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");

UPDATE:
This is what I came up using query syntax (and only one query):

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM