我一直习惯用正则式来处理文本,包括XML文件,只是偶尔才用一下XmlDocument和XPath之类的东东。

        最近做SP,移到的MISC系统从1.5升级到了1.6,它的1.5版用的是简单的XML格式响应和请求,现在的1.6版使用了标准的SOAP信息,一个标准的MISC对SP的请求可能是这样的:
XPath遇上命名空间<?xml version="1.0" encoding="utf-8"?>
XPath遇上命名空间
<SOAP-ENV:Envelope
XPath遇上命名空间 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
XPath遇上命名空间 xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
XPath遇上命名空间  xmlns:SOAP-ENV
="http://schemas.xmlsoap.org/soap/envelope/"
XPath遇上命名空间   xmlns:SOAP-ENC
="http://schemas.xmlsoap.org/soap/encoding/">
XPath遇上命名空间    
<SOAP-ENV:Header>
XPath遇上命名空间        
<TransactionID xmlns="http://www.monternet.com/dsmp/schemas/">06070516230084</TransactionID>
XPath遇上命名空间    
</SOAP-ENV:Header>
XPath遇上命名空间    
<SOAP-ENV:Body>
XPath遇上命名空间        
<SyncOrderRelationReq xmlns="http://www.monternet.com/dsmp/schemas/">
XPath遇上命名空间            
<Version>1.5.0</Version>
XPath遇上命名空间            
<MsgType>SyncOrderRelationReq</MsgType>
XPath遇上命名空间            
<Send_Address>
XPath遇上命名空间                
<DeviceType>0</DeviceType>
XPath遇上命名空间                
<DeviceID>0011</DeviceID>
XPath遇上命名空间            
</Send_Address>
XPath遇上命名空间            
<Dest_Address>
XPath遇上命名空间                
<DeviceType>400</DeviceType>
XPath遇上命名空间                
<DeviceID>0</DeviceID>
XPath遇上命名空间            
</Dest_Address>
XPath遇上命名空间            
<FeeUser_ID>
XPath遇上命名空间                
<UserIDType>1</UserIDType>
XPath遇上命名空间                
<MSISDN>13800138000</MSISDN>
XPath遇上命名空间                
<PseudoCode>
XPath遇上命名空间                
</PseudoCode>
XPath遇上命名空间            
</FeeUser_ID>
XPath遇上命名空间            
<DestUser_ID>
XPath遇上命名空间                
<UserIDType>1</UserIDType>
XPath遇上命名空间                
<MSISDN>13800138000</MSISDN>
XPath遇上命名空间                
<PseudoCode></PseudoCode>
XPath遇上命名空间            
</DestUser_ID>
XPath遇上命名空间            
<LinkID>LinkID</LinkID>
XPath遇上命名空间            
<ActionID>1</ActionID>
XPath遇上命名空间            
<ActionReasonID>1</ActionReasonID>
XPath遇上命名空间            
<SPID>900000</SPID>
XPath遇上命名空间            
<SPServiceID>abcd</SPServiceID>
XPath遇上命名空间            
<AccessMode>3</AccessMode>
XPath遇上命名空间            
<FeatureStr></FeatureStr>
XPath遇上命名空间        
</SyncOrderRelationReq>
XPath遇上命名空间    
</SOAP-ENV:Body>
XPath遇上命名空间
</SOAP-ENV:Envelope>

哈哈,这下麻烦大了,不仅SOAP标准本身定义了多个命名空间,而且卓望的人还给移动定义了个命名空间(但是,其实并没有提供Schema)。
        对于这种带有命名空间的XML进行SelectNodes,可不能再使用简单XPath语句就行:

XPath遇上命名空间string xml = "XPath遇上命名空间XPath遇上命名空间";
XPath遇上命名空间XmlDocument xmlDoc 
= new XmlDocument();
XPath遇上命名空间xmlDoc.LoadXml(xml);
XPath遇上命名空间xmlDoc.SelectNodes(
"//SOAP-ENV:Header/TransationID");//取不到任何节点

        此时,需要对命名空间一一定义:
XPath遇上命名空间            string xml = "XPath遇上命名空间XPath遇上命名空间";
XPath遇上命名空间            XmlDocument xmldoc 
= new XmlDocument();
XPath遇上命名空间            xmldoc.LoadXml(xml);
XPath遇上命名空间            XmlNamespaceManager xnm 
= new XmlNamespaceManager(xmldoc.NameTable);
XPath遇上命名空间            xnm.AddNamespace(
"SOAP-ENV","http://schemas.xmlsoap.org/soap/envelope/");
XPath遇上命名空间            xnm.AddNamespace(
"Mo","http://www.monternet.com/dsmp/schemas/");
XPath遇上命名空间            xmldoc.SelectNodes(
"//SOAP-ENV:Header/Mo:TransationID",xnm);//注意,就算是用默认命名空间的节点,也要为命名空间定义一个名字,并使用这个名字。

        感觉周围的开发者用XPath和XSTL的好少。

相关文章:

猜你喜欢
  • 2021-07-14
  • 2021-08-29
  • 2022-12-23
  • 2021-06-04
相关资源
相似解决方案