3
<Root>
  <P1 Text ="A" >
    <P2 Text = "AA">
      <P3 Text = "AAA">
        <L Text = "l_A"/>
        <L Text = "l_B"/>
        <L Text = "l_C"/>
      </P3>
      <P3 Text = "BBB">
        <L Text = "l_D"/>
        <L Text = "l_E"/>
        <L Text = "l_F"/>
      </P3>
    </P2>
    <P2 Text = "BB">
       <L Text = "l_G"/>
       <L Text = "l_H"/>
       <L Text = "l_I"/>
    </P2>
  </P1>
</Root>  

深さ10レベルまでの数千の可変ネストノードを含むXMLドキュメントから、次のように「P」親のいずれかに属する葉のみをプログラムで取得したいと思います。たとえば、上記の例では、P2「AA」を選択します。 l_Aからl_Fを生成し、P3"BBB"はl_Dをl_Fに生成します。

4

2 に答える 2

1

このようなもの(文字列のリストを返します):

    XDocument doc = XDocument.Load(@"test.xml");

    string level = "P3";
    string levelAttr = "AAA";

    var list = (from d in doc.Descendants(level)
                let xAttribute = d.Attribute("Text")
                where xAttribute != null && xAttribute.Value == levelAttr
                from l in d.Descendants("L")
                let lAttribute = l.Attribute("Text")
                where lAttribute != null
                select lAttribute.Value);

Text属性が常に存在する場合は、属性nullチェックを削除できます...

于 2012-07-04T12:31:38.577 に答える
0

1つの方法は、XPathを使用することです( LINQXmlDocumentを使用していない場合)

XPathは次のようになります。

//P2[@Text='AA']//L/@Text

そしてあなたのコードはこのようになります:

XmlDocument document; //init and load it

static List<String> GetLeavesText(int pLevel /* 2 */, string pText /* AA */)
{
    var result = new List<String>();

    //loaded document

    var nodeList = document.SelectNodes(String.Format(@"//P{0}[@Text='{1}']//L/@Text", pLevel, pText));
    if (nodeList != null)
        foreach (XmlNode xmlNode in nodeList)
        {
            result.Add(xmlNode.InnerText);
        }

    return result;
}
于 2012-07-05T06:46:27.317 に答える