2012-07-31 2 views
0

나는 잠시 동안 이것을 검색해 왔으며 해결책을 찾을 수 없습니다. 나는 xmldocument로로드하고 요청의 특정 속성 (상태)을 얻으려고하는 HttpWebRequest에서 반환되는 XML을 가지고있다. 반환되는 xml은 아래와 같습니다.C#에서 xml 특성 읽기

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    > 
    <soapenv:Body> 
    <processRequestResponse> 
     <parameters> 
     <ns1:searchResponse status="success" xmlns:ns1="urn:oasis:names:tc:SPML:2:0:search"> 
      <ns1:pso> 
      <ns2:psoID ID="Users:####" xmlns:ns2="urn:oasis:names:tc:SPML:2:0"/> 
      <ns3:data xmlns:ns3="urn:oasis:names:tc:SPML:2:0"> 
       <ns4:attr name="Users.User ID" xmlns:ns4="urn:oasis:names:tc:DSML:2:0:core"> 
       <ns4:value></ns4:value> 
       </ns4:attr> 
      </ns3:data> 
      </ns1:pso> 
     </ns1:searchResponse> 
     </parameters> 
    </processRequestResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

이 데이터를 가져 오기 위해 사용하고있는 코드는 다음과 같습니다.

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream()); 
string returnResponse = reader.ReadToEnd(); 

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(returnResponse); 

XmlNode root = doc.DocumentElement; 
XmlNode searchResponse = root.SelectSingleNode("Envelope/Body/processRequestResponse/parameters/searchResponse"); 
XmlAttribute status = (XmlAttribute)searchResponse.Attributes.GetNamedItem("status"); 
if (status != null) 
{ 
    string statusReturn = status.Value; 
    return statusReturn; 
} 
else 
{ 
    return "value is null"; 
} 

상태 값을 줄 수있는 도움이 필요하시면 도움이됩니다. xmlattrbute 상태 줄에서 개체 참조 오류가 계속 발생합니다.

+0

들여하세요 XML 샘플은 읽을 수 없기 때문에 추출하려고하는 것을 말하기 어렵습니다. – millimoose

답변

3

XML 문서에 네임 스페이스가 포함되어 있습니다. XPath 쿼리가 작동하려면 XML 문서의 네임 스페이스를 고려해야합니다.

C# 코드에서 이러한 네임 스페이스를 추가하고 XPath에서이 네임 스페이스를 참조하는 방법은 this question을 참조하십시오. 또는 와일드 카드 매칭을 사용하는 방법에 대한 this question 참조

0

이 크기에이 입어 (당신이 모든 요소 이름을 할 필요가 있기 때문에, 혼란스러워 것 귀하의 경우 비록합니다.) :

 const string ValueIsNull = "value is null"; 
     string returnResponse; 

     using (var response = (HttpWebResponse)request.GetResponse()) 
     { 
      if (response == null) 
      { 
       return ValueIsNull; 
      } 

      using (var responseStream = response.GetResponseStream()) 
      { 
       if (responseStream == null) 
       { 
        return ValueIsNull; 
       } 

       using (var reader = new StreamReader(responseStream)) 
       { 
        returnResponse = reader.ReadToEnd(); 
       } 
      } 
     } 

     var doc = new XmlDocument(); 

     doc.LoadXml(returnResponse); 

     var namespaces = new XmlNamespaceManager(doc.NameTable); 

     namespaces.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); 
     namespaces.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); 
     namespaces.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
     namespaces.AddNamespace("ns1", "urn:oasis:names:tc:SPML:2:0:search"); 
     namespaces.AddNamespace("ns2", "urn:oasis:names:tc:SPML:2:0"); 
     namespaces.AddNamespace("ns3", "urn:oasis:names:tc:SPML:2:0"); 
     namespaces.AddNamespace("ns4", "urn:oasis:names:tc:DSML:2:0:core"); 

     XmlNode root = doc.DocumentElement; 

     if (root == null) 
     { 
      return ValueIsNull; 
     } 

     var searchResponse = root.SelectSingleNode("/soapenv:Envelope/soapenv:Body/processRequestResponse/parameters/ns1:searchResponse", namespaces); 

     if ((searchResponse == null) || (searchResponse.Attributes == null)) 
     { 
      return ValueIsNull; 
     } 

     var status = (XmlAttribute)searchResponse.Attributes.GetNamedItem("status"); 

     return status == null ? ValueIsNull : status.Value;