2009-04-30 16 views
5

私はこれに似た構造を含むXML文書で働いている:私は現在、この方法でXMLドキュメントにファイルからこれをロードしていますSelectSingleNodeがnullを返すのはなぜですか?

<MT> 
    <Events> 
    <event id="1"> 
     <field name="blah" value="a_value" type="atype" /> 
     . 
     . 
     . 
    </event> 
    </Events> 
</MT> 

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load("somefile.xml"); //Successfully loads btw 

私は次のコード行を実行しようとすると、しかし、私が問題にしてこれだけ特定の文書で実行しています:

私はリグの午前htは 'id'という名前の属性を使用しているためにnullが返されていると推測したり、コードに何か不足していますか?

答えて

9

私はXMLファイル

<MT> 
    <Events> 
    <event id="1"> 
     <field name="blah" value="a_value" type="atype" /> 
    </event> 
    </Events> 
</MT> 

とコード

XmlDocument doc = new XmlDocument(); 
doc.Load(@"C:\test.xml"); 

XmlNode node = doc.SelectSingleNode("//event[@id='1']"); 

予想通りこれがnull以外のノードを返すを使用して、これを複製することはできません。

更新

xmlns="example.org"から<MT>要素を追加した後、私は、XPathの名前空間マネージャを設定し、イベントの名前空間を使用する必要がありました。何らかの理由でデフォルトの名前空間を使用できませんでした。

XmlDocument doc = new XmlDocument(); 
doc.Load(@"D:\test.xml"); 

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); 
manager.AddNamespace("e", "http://example.org"); 

XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager); 

これを機能させようとすると、私は混乱します。なぜXmlNamespaceManagerに含まれている名前空間が見つからない場合、XmlNamespaceManagerは文書からXmlNameTableを必要としますか?で、なぜ名前空間名前空間を定義する必要がありますか?私は、誰かが短いコメントを落とす可能性がある場合は、感謝します。

+0

私自身の質問に答える。 XmlNameTableは文字列の比較を最適化するために使用されています.XmlNamespaceManagerに既存の名前テーブルを付けることができるため、XmlDocument要素との高速比較が可能になり、NameTableを共有します。 –

+0

あなたのアップデートは理にかなっているようです。私はxmlの短縮形をつけようとしていて、名前空間を投稿するのを忘れていました。これを試してみるために余分な時間をとっていただきありがとうございます。元のXMLから名前空間を削除すると、すべてが正しく動作するようになります。 System.Xml名前空間についてさらに検討する価値があります。 –

関連する問題