2011-08-17 5 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

개인적으로 XML 대신 LINQ를 사용합니다. 네임 스페이스 지원은 처리하기가 훨씬 쉽습니다. 어쨌든 Envelope이 단순히 루트 노드라는 점을 감안할 때 왜 XPath를 사용해야하는지 명확하지 않습니다. 단지 이 루트 노드을 요청하지 않는 이유는 무엇입니까? 당신이 정말로이 XPath를 사용하려면 경우

그러나, 당신은 XmlDocument의 이름 테이블에서 새 XmlNamespaceManager를 만드는 접두사를 등록하고 SelectSingleNode overload which takes one에 네임 스페이스 관리자에 전달할 수 있습니다.

this answer에 몇 가지 샘플 코드가 있지만, 다시 말하지만 ... 특히 LINQ to XML을 사용하면 모든 "env : Body"요소 (예 : 여기에 하나만 있지만 ...)은 다음과 같이 보입니다.

+0

감사합니다. 연민은 linq에 내 전화가 아니야. – griegs