2011-08-17 27 views
3

私は以下のXMLを持っています。名前空間マネージャーまたはXsltContextが必要です

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> 
   <env:Header> 
       <mm7:TransactionID xmlns:mm7='http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-4' env:mustUnderstand='1'>6797324d</mm7:TransactionID> 
   </env:Header> 
   <env:Body> 
       <DeliveryReportReq xmlns='http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-4'> 
           <MM7Version>6.8.0</MM7Version><MMSRelayServerID>TARAL</MMSRelayServerID> 
      <MessageID>T*3*T\*4\*855419761</MessageID> 
      <Recipient> 
       <RFC2822Address>+61438922562/TYPE=hidden</RFC2822Address> 
      </Recipient> 
      <Sender> 
       <RFC2822Address>61418225661/TYPE=hidden</RFC2822Address> 
      </Sender> 
      <Date>2011-08-15T12:57:27+10:00</Date> 
      <MMStatus>Retrieved</MMStatus> 
      <StatusText>The message was retrieved by the recipient</StatusText> 
     </DeliveryReportReq>   
    </env:Body> 
</env:Envelope> 

次に、次のC#コードがあります。

XmlDocument xDoc = new XmlDocument(); 
xDoc.LoadXml(file); 
XmlNode xNode = xDoc.SelectSingleNode("env:Envelope"); 

とエラーが表示されます。

名前空間マネージャーまたはXsltContextが必要です。このクエリには、接頭辞、変数、またはユーザー定義関数があります。

誰でもこの問題を解決する方法は知っていますか?

答えて

12

個人的に私は代わりにLINQ to XMLを使用します。そのネームスペースのサポートは、処理するのがはるかに簡単です。なぜならEnvelopeが単にルートノードであることを考えれば、なぜここでXPathを使用したいのかは明らかではありません。ただがルートノードを求めるのはなぜですか?あなたが本当には、XPathを使用したい場合は

しかし、あなたは、XmlDocumentで名前のテーブルから新しいXmlNamespaceManagerを作成する接頭辞を登録しSelectSingleNode overload which takes oneに名前空間マネージャに渡すことができます。

this answerにいくつかのサンプルコードがありますが、特にLINQ to XMLを使用して、すべての "env:Body"要素の検索(たとえば、ここで1つだけですが...)は次のようになります:

XNamespace env = "http://schemas.xmlsoap.org/soap/envelope/"; 
var bodies = doc.Descendants(env + "Body"); 
+0

これは感謝しています。残念なlinqの私の呼び出しではない – griegs

関連する問題