问题描述
如题,最近做个项目,需要解析XML文件,里面有些自定义的命名空间,然后上网查了相关资料,多是在根节点里面声明的,可以通过下面代码读取XmlDocumentxmldoc=newXmlDocument();xmldoc.Load("a091234opk.xml");XmlNamespaceManagernsmgr=newXmlNamespaceManager(xmldoc.NameTable);;nsmgr.AddNamespace("tcs",nameSpace);stringvalue=xmldoc.SelectSingleNode("/tcs:TcsUser/tcs:UserId",nsmgr).InnerText;Console.WriteLine(value);//输出
这种代码读取的XML文件,下面这种格式的好用,也就是根节点就声明命名空间<?xmlversion="1.0"encoding="UTF-8"?><tcs:TcsFlow201schemaLocation="http://www.chinaport.gov.cn/tcs/v2TcsWorkFlow.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tcs="http://www.chinaport.gov.cn/tcs/v2"><tcs:TcsUser><tcs:UserId>T61432564300</tcs:UserId><tcs:UserPrivateKey>tcs</tcs:UserPrivateKey></tcs:TcsUser></tcs:TcsFlow201>
问题是,如果命名空间是在子节点里面声明的<?xmlversion="1.0"encoding="UTF-8"?><TCS101Message><MessageHead><MessageType>001</MessageType><MessageId>T61432564300201309060000000105</MessageId><MessageTime>20130906102844</MessageTime><SenderId>T61432564300</SenderId><SenderAddress>TQDLYG420000@TCS10001</SenderAddress><ReceiverId>T99999999999</ReceiverId><ReceiverAddress>T99999999999@TCS10001</ReceiverAddress></MessageHead><MessageBody><tcs:TcsFlow201schemaLocation="http://www.chinaport.gov.cn/tcs/v2TcsWorkFlow.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tcs="http://www.chinaport.gov.cn/tcs/v2"><tcs:TcsUser><tcs:UserId>T61432564300</tcs:UserId><tcs:UserPrivateKey>tcs</tcs:UserPrivateKey></tcs:TcsUser></tcs:TcsFlow201></MessageBody></TCS101Message>
这种xml,如果用XmlDocumentxmldoc=newXmlDocument();xmldoc.Load("a091234opk.xml");XmlNamespaceManagernsmgr=newXmlNamespaceManager(xmldoc.NameTable);;nsmgr.AddNamespace("tcs",nameSpace);stringvalue=xmldoc.SelectSingleNode("/tcs:TcsUser/tcs:UserId",nsmgr).InnerText;Console.WriteLine(value);//输出
这样代码,就读不出来,程序就会报异常,请教各位高手该如何读取命名空间在子节点里面声明,读取节点内容呢???
解决方案
本帖最后由 PANCNhao 于 2014-01-08 11:23:31 编辑
解决方案二:
引用楼主PANCNhao的回复:
如题,最近做个项目,需要解析XML文件,里面有些自定义的命名空间,然后上网查了相关资料,多是在根节点里面声明的,可以通过下面代码读取XmlDocumentxmldoc=newXmlDocument();xmldoc.Load("a091234opk.xml");XmlNamespaceManagernsmgr=newXmlNamespaceManager(xmldoc.NameTable);;nsmgr.AddNamespace("tcs",nameSpace);stringvalue=xmldoc.SelectSingleNode("/tcs:TcsUser/tcs:UserId",nsmgr).InnerText;Console.WriteLine(value);//输出这种代码读取的XML文件,下面这种格式的好用,也就是根节点就声明命名空间<?xmlversion="1.0"encoding="UTF-8"?><tcs:TcsFlow201schemaLocation="http://www.chinaport.gov.cn/tcs/v2TcsWorkFlow.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tcs="http://www.chinaport.gov.cn/tcs/v2"><tcs:TcsUser><tcs:UserId>T61432564300</tcs:UserId><tcs:UserPrivateKey>tcs</tcs:UserPrivateKey></tcs:TcsUser></tcs:TcsFlow201>
问题是,如果命名空间是在子节点里面声明的<?xmlversion="1.0"encoding="UTF-8"?><TCS101Message><MessageHead><MessageType>001</MessageType><MessageId>T61432564300201309060000000105</MessageId><MessageTime>20130906102844</MessageTime><SenderId>T61432564300</SenderId><SenderAddress>TQDLYG420000@TCS10001</SenderAddress><ReceiverId>T99999999999</ReceiverId><ReceiverAddress>T99999999999@TCS10001</ReceiverAddress></MessageHead><MessageBody><tcs:TcsFlow201schemaLocation="http://www.chinaport.gov.cn/tcs/v2TcsWorkFlow.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tcs="http://www.chinaport.gov.cn/tcs/v2"><tcs:TcsUser><tcs:UserId>T61432564300</tcs:UserId><tcs:UserPrivateKey>tcs</tcs:UserPrivateKey></tcs:TcsUser></tcs:TcsFlow201></MessageBody></TCS101Message>
这种xml,如果用XmlDocumentxmldoc=newXmlDocument();xmldoc.Load("a091234opk.xml");XmlNamespaceManagernsmgr=newXmlNamespaceManager(xmldoc.NameTable);;nsmgr.AddNamespace("tcs",nameSpace);stringvalue=xmldoc.SelectSingleNode("/tcs:TcsUser/tcs:UserId",nsmgr).InnerText;Console.WriteLine(value);//输出
这样代码,就读不出来,程序就会报异常,请教各位高手该如何读取命名空间在子节点里面声明,读取节点内容呢???
linqxml
解决方案三:
XmlNodexmlNode=doc.SelectSingleNode("//response");XmlNodeListxmllist=doc.SelectNodes("//bonusItem");if(xmlNode.HasChildNodes){k3.responseCode=xmlNode.Attributes["code"].Value;}
解决方案四:
引用1楼hou306010849的回复:
linqxml
能详细说明下吗,这样的东西真的没太接触
解决方案五:
引用2楼u013267214的回复:
XmlNodexmlNode=doc.SelectSingleNode("//response");XmlNodeListxmllist=doc.SelectNodes("//bonusItem");if(xmlNode.HasChildNodes){k3.responseCode=xmlNode.Attributes["code"].Value;}
看不明白
解决方案六:
XmlNodexmlNode=doc.SelectSingleNode("//tcs:TcsUser");k3.responseCode=xmlNode.Attributes["tcs:UserId"].Value;得到值//T61432564300
解决方案七:
引用5楼u013267214的回复:
XmlNodexmlNode=doc.SelectSingleNode("//tcs:TcsUser");k3.responseCode=xmlNode.Attributes["tcs:UserId"].Value;得到值//T61432564300
你确定这样能读出来???如果这么简单就能解决了,我也不会困惑这么久,到这来问啊
解决方案八:
system.xml.linq.dll和system.xml.dll
解决方案九:
参考:
解决方案十:
stringresponse="<?xmlversion="1.0"encoding="GBK"?><messageversion="1.0"id="801392013111800000782"><header></header><body><responsecode="0000"message="成功">需要内容</response></body></message>";XmlDocumentdoc=newXmlDocument();doc.LoadXml(response);XmlNodexmlNode=doc.SelectSingleNode("//response");Label1.Text=xmlNode.InnerXml;//需要内容Label1.Text=xmlNode.Attributes["message"].Value;//成功我也不太清楚你需要什么样的值方法就这2种我会的
解决方案十一:
LinqToXml有个获取DefaultNameSpace的方法,带NameSpace的这东西我就用过一次,不过我猜你应该可以在获取到Elements()集合后再用遍历每个节点的方式读取相应的NameSpace
解决方案十二:
上面貌似都没仔细看你的问题,LinqToXml对于存在NameSpace的如果不是NameSpace+"节点"的方式而是直接"节点"去获取指定节点同样是获取不到的,就是说存在NameSpace的,通过常规的xml读取存在问题,通过linq读取一样存在问题
解决方案十三:
楼主如何解决的?