2009-04-24 9 views
2

下記のように私は常にXmlDocument Example.xmlの一部を持っている:XmlDocumentのNodeListから属性を取得するには?

<rapaine dotoc="palin" domap="rattmin"> 
    <derif meet="local" /> 
    <derif meet="intro" /> 
. 
. 
. 
</rapaine> 

ここで私はノードリストを作成し、その属性を取得するためにraplin要素を取得しています。

属性 'dotoc'と 'domap'が常に固定されたそれぞれの値を持つrapaineの属性であることを確認したいのですが、その属性 'meet'でchildNodes 'deriff' 。ここで値は変更のみです。
私はコードの一部を書きましたが、コンパイルエラーはありませんが、デバッグ時には、forループ内で属性と子ノードをチェックしていないことがわかりました。

XmlNodeList listOfSpineRootNodes = opfXmlDoc.GetElementsByTagName("rapine"); 
for (int x = 0; x < listOfSpineRootNodes.Count; x++) 
    { 
    XmlAttributeCollection spineAttributes = listOfSpineRootNodes[x].Attributes; 
    string id = spineAttributes[0].Value; 
    if (spineAttributes != null) 
    { 
     XmlNode attrToc = spineAttributes.GetNamedItem("dotoc"); 
     XmlNode attrPageMap = spineAttributes.GetNamedItem("domap"); 
     if (attrToc.Value == "palin" && attrPageMap.Value == "rattmine") 
     { 
     if (listOfSpineRootNodes != null) 
     { 
      foreach (XmlNode spineNodeRoot in listOfSpineRootNodes) 
      { 
      XmlNodeList listOfSpineItemNodes = spineNodeRoot.ChildNodes; 
      if (listOfSpineItemNodes != null) 
      { 
       foreach (XmlNode spineItemNode in listOfSpineItemNodes) 
       { 
       if (spineItemNode.NodeType == XmlNodeType.Element 
        && spineItemNode.Name == "derif") 
       { 
        XmlAttributeCollection spineItemAttributes = spineItemNode.Attributes; 

        if (spineItemAttributes != null) 
        { 
        XmlNode attrIdRef = spineItemAttributes.GetNamedItem("meet"); 
        if (attrIdRef != null) 
        { 
         spineListOfSmilFiles.Add(attrIdRef.Value); 
        } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 

あなたは おかげで....

答えて

2

これはXPathを使用して次のコードで行うことができます。 XPathはXML文書を照会するために特別に設計された言語なので、XML文書を学習することを検討する必要があります。ほとんどの初心者はW3schoolsで学習を始めるのが好きです。ここで

コードです:あなたの参考のため

XmlNodeList meetList = opfXmlDoc.SelectNodes("/rapaine[(@dotoc = 'palin') and (@domap = 'rattmin')]/derif/@meet") 
if (meetList.Count > 0) 
{ 
    foreach (XmlNode meet in meetList) 
    { 
    spineListOfSmilFiles.Add(meet.Value); 
    } 
} 

、XPath式:

/rapaine[(@dotoc = 'palin') and (@domap = 'rattmin')]/derif/@meet 

のように説明することができます。

a)は持っているすべてのrapaineルートレベルの要素を探します属性「dotoc」の値が「palin」であり、属性「domap」の値が「rattmin」である。

b)rapaineの要素内には、すべてderifの子があります。

c)これらの要素内では、meetのすべての属性を取得します。

コードがどれくらい簡潔になるか注意してください。

+0

ああ、そのLuks great.Thinksリンクとコードの一部です。 –

+0

私の喜び!ハッピーラーニング。 :-) – Cerebrus

0

は、あなただけの単純なXPath式でこの問題を解決することはできません..私は間違ったつもりどこを教えていただけますか?

条件付きのすべてのネストループは、単に問題を求めています。

+0

いいえ、XPathを使用することはできません。正直なところ、XPathの使用方法はわかりません。 ありがとう –

+0

はい、これにXPathを使用できますが、それを調べなければなりません。 – Natrium

+0

私はあなたの問題が1つの式で解決されるとは言いませんが、小さな断片に分割したい場合がありますし、繰り返し行う必要があるかもしれませんが、一般的に可能であると確信しています。 –

0

使用する.NETのバージョンによっては、LINQでこれを簡略化することができます。

関連する問題