Linq to XML - проблема выбора элементов - PullRequest
0 голосов
/ 09 февраля 2011
<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.

Есть идеи, что мне нужно изменить / добавить?

Спасибо

David

1 Ответ

1 голос
/ 09 февраля 2011

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...