使用C#解析具有多个名称空间的Xml

时间:2017-08-30 14:24:29

标签: c# xml namespaces

我无法解析包含多个名称空间的Xml,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header>
      <h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="14" MinorVersion="3" MajorBuildNumber="352" MinorBuildNumber="0" Version="Exchange2010_SP2" />
   </s:Header>
   <s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <GetMailTipsResponse xmlns="http://schemas.microsoft.com/exchange/services/2006/messages" ResponseClass="Success">
         <ResponseCode>NoError</ResponseCode>
         <ResponseMessages>
            <MailTipsResponseMessageType ResponseClass="Success">
               <ResponseCode>NoError</ResponseCode>
               <m:MailTips xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
                  <t:RecipientAddress xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
                     <t:Name />
                     <t:EmailAddress>emailaddress@organization.com</t:EmailAddress>
                     <t:RoutingType>SMTP</t:RoutingType>
                  </t:RecipientAddress>
                  <t:PendingMailTips xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" />
                  <t:OutOfOffice xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
                     <t:ReplyBody>
                        <t:Message />
                     </t:ReplyBody>
                  </t:OutOfOffice>
               </m:MailTips>
            </MailTipsResponseMessageType>
         </ResponseMessages>
      </GetMailTipsResponse>
   </s:Body>
</s:Envelope>

我尝试了下面的代码但是你可以看到第一个带有Soap Name Space的节点工作正常,但此后我无法检索我需要的节点信息 - 节点 -

/s:Envelope/s:Body/GetMailTipsResponse/ResponseMessages/MailTipsResponseMessageType/m:MailTips/t:RecipientAddress/t:Message

以下是我尝试过的代码:

string getXmlInfo (string resultXml) 

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(resultXml);

XmlNamespaceManager soapNsManager = new XmlNamespaceManager(xmlDoc.NameTable);
soapNsManager.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");
XmlNode xmlNode = xmlDoc.SelectSingleNode("//s:Envelope/s:Body", soapNsManager); //works fine - the node now contains the Xml starting with the node 

XmlNode xmlNode1 = xmlDoc.SelectSingleNode("//s:Envelope/s:Body/GetMailTipsResponse/ResponseMessages/MailTipsResponseMessageType", soapNsManager); //returns NULL


XmlNode innerNode1 = xmlNode.SelectSingleNode("//GetMailTipsResponse/ResponseMessages/MailTipsResponseMessageType"); // returns NULL
XmlNode innerNode2 = xmlNode.SelectSingleNode("//GetMailTipsResponse", soapNsManager); //returns NULL

// the next line throws an exception
//XmlNode messageNode = xmlDoc.SelectSingleNode("/s:Envelope/s:Body/GetMailTipsResponse/ResponseMessages/MailTipsResponseMessageType/m:MailTips/t:RecipientAddress/t:Message", manager); 

}

以下是我根据@LocEngineer的回复尝试的内容:

            XmlNamespaceManager manager = new XmlNamespaceManager(xmlDoc.NameTable);
        manager.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");
        manager.AddNamespace("blank", "http://schemas.microsoft.com/exchange/services/2006/types");
        manager.AddNamespace("m", "http://schemas.microsoft.com/exchange/services/2006/types");
        manager.AddNamespace("t", "http://schemas.microsoft.com/exchange/services/2006/types");

        XmlNode messageNode = xmlDoc.SelectSingleNode("/s:Envelope/s:Body/blank:GetMailTipsResponse/blank:ResponseMessages/blank:MailTipsResponseMessageType/m:MailTips/t:OutOfOffice/t:ReplyBody/t:Message", manager);

messageNode显示为NULL

1 个答案:

答案 0 :(得分:0)

您还需要一个XmlNamespaceManager前缀,用于GetMailTipsResponse节点中引入的无前缀命名空间,该节点包含XML中没有前缀的节点:

  

GetMailTipsResponse xmlns =“http://schemas.microsoft.com/exchange/services/2006/messages”

然后在你的XPath中适当地使用它,使用“m”作为无前缀节点的前缀:

XmlNamespaceManager soapNsManager = new XmlNamespaceManager(xmlDoc.NameTable);
soapNsManager.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");
soapNsManager.AddNamespace("m", "http://schemas.microsoft.com/exchange/services/2006/messages");
XmlNode xmlNode1 = xmlDoc.SelectSingleNode("/s:Envelope/s:Body/m:GetMailTipsResponse/m:ResponseMessages/m:MailTipsResponseMessageType", soapNsManager);