2009-07-23 6 views
2

私はpostfixが.xmlではなく、コンポーネントが であるxmlファイルをいくつか持っていますが、今はC#プログラムでそれらを扱いたいと思っています。これらのXMLファイルXmlDocument.SelectSingleNodeはルートノードのためにnullを返します

var doc = new XmlDocument(); 
doc.Load(path); // MG: edited to Load based on comment 
XmlNode root = doc.SelectSingleNode("rootNodename"); 

の根がnullであると思われ、どのように私はこれに対処すべきか?

+0

ここで間違っていることが複数ある可能性がありますが、ファイルの拡張子は間違いです。デバッガの "doc"を見て、読み込んでいないことを確認しましたか? – womp

+0

これらのXMLファイルの最初の数行を投稿できますか? –

答えて

5

、私は問題は名前空間で期待します。あなたは例のXMLを持っていますか?名前空間での取り扱いXMLは、例えば

;-p「楽しい」...取得します。あなたのXMLは、XMLのエイリアスを宣言した場合でも、あなたはまだあなたの名前空間のためにそれらを再宣言する必要があるかもしれないこと

XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(@"<test xmlns='myFunkyUri' value='abc'/>"); 
    // wrong; no namespace consideration 
    XmlElement root = (XmlElement)doc.SelectSingleNode("test"); 
    Console.WriteLine(root == null ? "(no root)" : root.GetAttribute("value")); 
    // right 
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
    nsmgr.AddNamespace("x", "myFunkyUri"); // x is my alias for myFunkyUri 
    root = (XmlElement)doc.SelectSingleNode("x:test", nsmgr); 
    Console.WriteLine(root == null ? "(no root)" : root.GetAttribute("value")); 

マネージャー。

+0

はい、実際には、デフォルトの名前空間(接頭辞なしのもの) – abusemind

4

LoadXmlはファイルパスではなくXML文字列をとります。代わりに読み込みを試みます。 Loadはファイル拡張子を気にしません。ここで

はロード用documentionへのリンクです:あなたはLoad/LoadXml混乱を解決したことを考えると http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.load.aspx

+0

はい質問を書いたときに間違いました。実際にはLoad()も試しましたが、Load()は例外を生成しますが、問題なくファイルをロードしますが、ルートノードを見つけることはできません。 – abusemind

+0

実際には、実際の問題は名前空間だと思っています...(回答を参照) –

0

私はこの問題を抱えていました:rootNodenameの前にダッシュを入れてください 代わりに: XmlNode root = doc.SelectSingleNode( "rootNodename");

これを実行します。 XmlNode root = doc.SelectSingleNode( "/ rootNodename");

関連する問題