2010-11-30 22 views
0

なぜこのxPath(c#)は動作しませんか?

これはxml:

<?xml version="1.0" encoding="UTF-8"?> 
<video xmlns="UploadXSD"> 
    <title> 
    A vid with Pete 
    </title> 
    <description> 
    Petes vid 
    </description> 
    <contributor> 
    Pete 
    </contributor> 
    <subject> 
    Cat 2 
    </subject> 
</video> 

そしてこのxpath:

videoToAdd.Title = doc.SelectSingleNode(@"/video/title").InnerXml; 

そして、私は 'オブジェクトのインスタンスに設定されていないオブジェクト参照'を取得します。これがなぜ私が見ることができ、それは仕事に使用されたから有効なxpathである任意のアイデア...

+0

はあなたが文を初期化するドキュメントを表示することができますか? –

+3

'videoToAdd'または' doc'もそのエラーに従って 'null'になることがあります。 xpathが問題であることを確認しましたか? – tenfour

+1

デバッガを使用して、videoToAddまたはdocがnullかどうかを検出します。 – leppie

答えて

1

/video/titlevideo要素の中から名前空間のないtitle要素を返します。あなたは

0

をあなたのXMLからxmlns="UploadXSD"を削除するか、あなたのC#で適切な選択の名前空間を設定するか必要

は、それが可能<video>要素にdoc変数ポイントということですか?あなたのXML文書がXML名前空間を持っており、あなたがそれらの前に付ける必要があります要素を見つけるために

videoToAdd.Title = doc.SelectSingleNode(@"//xmlns:video/xmlns:title").InnerXml; 

:その場合、あなたはこれを試してみてください

videoToAdd.Title = doc.SelectSingleNode(@"./title").InnerXml; 

または

videoToAdd.Title = doc.SelectSingleNode(@"//video/title").InnerXml; 
0

のいずれかを記述する必要がありますxmlns:となります。

+1

いいえ、それは、許可されている接頭辞ではない名前空間接頭辞(コンテキストにはないものがあります)xmlnsを持つ要素を見つけるでしょう。上記の例では、SelectSingleNodeからnullが返され、InnerXMLを取得しようとするとNullReferenceExceptionが返されます。 –

1

xmlns="UploadXSD"という属性が原因で悲しいことがあります。パーサーが名前を解決するのを助けるためにXmlNamespaceManagerを使用する必要があるか、必要がない場合はxmlns属性を削除する必要があると思います。

6

XMLに名前空間の指定が含まれているため、ソースコードを変更する必要があります。
例:

XmlDocument doc = new XmlDocument(); 
doc.Load("doc.xml"); 
XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(doc.NameTable); 
xmlnsManager.AddNamespace("ns", "UploadXSD"); 

videoToAdd.Title = doc.SelectSingleNode(@"/ns:video/ns:title", xmlnsManager).InnerXml; 
+1

正解ですが、間違いがあると、SelectSingleNode(@ "/ ns:video/ns:title"、xmlnsManager) title要素も同じ名前空間を持ち、SelectSingleNodeにマネージャを渡す必要があるため、それを使用します。 –

+0

ああ申し訳ありませんが、それを逃した。回答が編集されました。 –

+0

まだ1ビット欠けていますが、それを含めるように編集しました。 –

関連する問題