web-dev-qa-db-ja.com

SelectSingleNodeを使用して属性値を取得するにはどうすればよいですか?

Xmlドキュメントを解析しています。gid(属性)値(3810)を見つける必要があります。

SelectSingleNode()に基づきます。属性名とその値を見つけるのは簡単ではないことがわかりました。

この方法を使用できますか、それとも別の方法に切り替える必要がありますか。

添付されているのは私のコードです。

bookobjを使用してgidの属性value _3810_を取得するにはどうすればよいですか。ありがとうございました。

以下のような私のtest.xmlファイル

_<?xml version="1.0" ?>
<root>
   <VersionInfo date="2007-11-28" version="1.0.0.2" />
   <Attributes>
      <AttrDir name="EFEM" DirID="1">
         <AttrDir name="Aligner" DirID="2">
            <AttrDir name="SequenceID" DirID="3">
               <AttrObj text="Slot01" gid="3810" unit="" scale="1" />
               <AttrObjCount value="1" />
           </AttrDir>
         </AttrDir>
      </AttrDir>
   </Attributes>
</root>
_

私はtest.csを以下のように書きました

_public class Sample
{    
    public static void Main()
    {    
        XmlDocument doc = new XmlDocument();
        doc.Load("test.xml");

        XmlNode book;
        XmlNode root = doc.DocumentElement;

        book = root.SelectSingleNode("Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]");

        Console.WriteLine("Display the modified XML document....");
        doc.Save(Console.Out);
    }
}
_

[2010年6月10日更新]

  1. Xmlファイルは複雑なファイルです。何千ものギッドが含まれています。ただし、Xpathごとに、gidは一意です。

  2. XmlファイルをTreeViewコントロールにロードします。 this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);。 _treeView1_AfterSelect_イベントが発生すると、_e.Node.FullPath_は文字列値として返されます。

  3. 文字列値_e.Node.FullPath_を解析します。次に、XPathAboveのメンバーを取得しました。次に、どのgidアイテムが選択されているかを見つけようとしました。

確かに戻り値としてgid値を見つける必要があります。

13
Nano HE

あなたは書ける

XmlAttribute gidAttribute = (XmlAttribute)book.Attributes.GetNamedItem("gid");
String gidValue = null;
if (gidAttribute!=null)
    value = gidAttribute.Value;

または、Xpathを展開して、属性をフェッチします。

Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]/@gid

@gidが一意の場合は、Xpathを使用するだけです。

"//AttrObj[@gid='3810']"

指定されたIDで目的のノードをフェッチします。ただし、各リクエストはドキュメント全体を検索することに注意してください。すべてのノードをフェッチしてから、idでキー設定されたマップに配置する方が効率的です。

"//AttrObj[@gid]"

使用する XmlNode.SelectNodes @ gid属性を持つすべてのAttrObjのリストをフェッチします。

8
mdma

XmlDocumentではなくDocumentRoot自体をクエリできます。

XmlDocument doc = new XmlDocument();
XmlNode book = doc.SelectSingleNode("..");
if (book != null)
{
    XmlAttribute gid = book.Attributes["gid"];
    if (gid != null)
    {
       string value = gid.Value;
    }
}
4
abatishchev

ここでの問題は、XPathがすべて間違っていたことです。あなたはこれを持っていました:

Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]

これは、すべての名前が一致したかどうかに応じて、Attributes要素を選択するかどうかを選択します。このXPathを使用すると、必要なgid属性に直接移動できます。

Attributes/AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']/@gid
0
JLRishe