3

子孫を使用して XDocument を使用して XML ドキュメントをウォークする場合、自分が親の最後の子であると判断するにはどうすればよいですか?

XDocument xmlDoc = XDocument.Parse(xml)

  foreach (var element in xmlDoc.Descendants())
        {
           //Need to determine the last child of the parent and do something here. 
        }

XML の例と返されると予想される内容。ドキュメントを動的にウォークする必要があり、XPath や Xquery を指定しないでください。なぜなら、これらはさまざまな XML ドキュメントに対して一般的に使用されるため、その理由について詳しく説明する必要はありません... XDocument でこれを実行できるかどうかを確認するだけです。ドキュメントが何レベルの深さであるかを知らなくても動的に実行できる場合を除き、XPath または XQuery でタグ名を指定しないというより良い方法があります。

<?xml version="1.0"?>
<Root> 
<Customer>
<CustID>1</CustID>
<Name>Smith, Joe</Name>
<CustomerTransDetail>
<CustID>1</CustID>
<CustTransID>1</CustTransID>
<Note>NA</Note>
</CustomerTransDetail>
<CustomerTransDetail>
<CustID>1</CustID>
<CustTransID>2</CustTransID>
<Note>N/A</Note>
</CustomerTransDetail>
</Customer>
<Customer>
<CustID>2</CustID>
<Name>Smith, Jane</Name>
<CustomerTransDetail>
<CustID>2</CustID>
<CustTransID>1</CustTransID>
<Note>N/A</Note>
</CustomerTransDetail>
<CustomerTransDetail>
<CustID>2</CustID>
<CustTransID>2</CustTransID>
<Note>N/A</Note>
</CustomerTransDetail>
</Customer>
</Root>

何かできるように、親の最後の子をいつヒットしたかを知る必要があります。そのため、たとえば Name ノードや Note ノードを押すたびに、何かを実行できます。

4

2 に答える 2

2

あなたが何をしようとしているのかはまだ少しわかりませんが、うまくいけば、これがあなたを正しい方向に向けることができます.

XDocument を使用しているため、少なくとも .NET 3.5 を使用していると想定しています。ほとんどの場合、Linq から XML への拡張メソッドを使用して、目的を達成できます。

XDocument doc = XDocument.Parse("xmlPath");
foreach (XElement element in doc.Root.Descendants())
{
    bool hasChildren = element.HasElements;
    bool hasSiblings = element.ElementsBeforeSelf().Any() || element.ElementsAfterSelf().Any();
    bool isLastChild = hasSiblings && !element.ElementsAfterSelf().Any();
}

ノードをたどる際に何をする必要があるかによって、ツリーをたどる際に再帰を考慮する必要がある場合があります。そうすれば、要素に兄弟があるかどうか、最後の兄弟であるかどうかなどを判断できます。

于 2012-07-09T20:49:36.473 に答える
0

すべてのブール値を導入せずに CB の回答と同じ結果を取得し、linq-query を使用します。

    var query = from element in doc.Descendants()
                where element.ElementsBeforeSelf().Any() && !element.ElementsAfterSelf().Any() 
                select element;

    foreach (XElement element in query)
    {
      // Do something ...
    }
于 2012-07-09T21:18:12.477 に答える