Linq to XML - 问题选择元素

时间:2011-02-09 12:27:29

标签: linq-to-xml

<Invoice type='Component' displayName='Invoice' pluralName='Invoices' Msgversion='1' version='1'>
  <UserData type='SpecialElement'>
    <Something />
  </UserData>
  <From type='SpecialElement'>
    <Something />
  </From>
  <To type='SpecialElement'>
    <Something />
  </To>
  <CdtDbtNoteAmt type='xsd:decimal' />
  <PmtDueDt type='xsd:date' />
  <Adjstmnt>
    <AdjAmt />
    <Rate />
  </Adjstmnt>
  <CpyDplct type='PickList'>
    <Item Text='Copy Duplicate' Value='CODU' />
    <Item Text='Copy' Value='COPY' />
    <Item Text='Duplicate' Value='DUPL' />
  </CpyDplct>
  <InvItems type='ParentElement'>
    <InvGd type='Element'>
      <GdDesc type='xsd:decimal' />
      <QtyVl type='xsd:decimal' />
      <ChrgAmt type='xsd:decimal' />
      <PrceVl type='xsd:decimal' />
    </InvGd>
  </InvItems>
</Invoice>

您好,

我需要获取元素

  • type属性不是SpecialElement或PickList
  • 有子元素
  • 父级的type属性不是ParentElement

因此,根据XML片段,我想获得Adjstmnet和InvGd元素。

我能得到的最接近的是

var query = from n in xe.Elements()
        let attributeType = n.Attribute("type").Value
        where attributeType != "SpecialElement"
        where attributeType != "PickList"
        where n.HasElements
        select n;

但不包括InvGd元素。

关于我需要更改/添加的内容的任何想法?

谢谢,

大卫

1 个答案:

答案 0 :(得分:1)

使用xe.Descendants()代替xe.Elements()会有所帮助。当然,您还需要添加有关父元素的检查。

var query = from el in xe.Descendants()
            let attType = (string)el.Attribute("type")
            let parentType = (string).el.Parent.Attribute("type")
            where attType != "SpecialElement" && attType != "PickList"
                  && el.HasElements
                  && parentType != "ParentElement"
            select el