怎样才能解析读取子节点里带前缀的XML文件?

问题描述

如题,最近做个项目,需要解析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读取一样存在问题
解决方案十三:
楼主如何解决的?

时间: 2024-09-16 00:21:19

怎样才能解析读取子节点里带前缀的XML文件?的相关文章

jsp读取大对象CLOB并生成xml文件示例

js|xml|对象|生成xml|示例 <%@ page contentType="text/html; charset=gb2312" %><%@ page info="database handler"%><%@ page import="java.io.*"%><%@ page import="java.net.*"%><%@ page import="jav

jsp读取大对象CLOB并生成xml文件示例_JSP编程

<%@ page contentType="text/html; charset=gb2312" %> <%@ page info="database handler"%> <%@ page import="java.io.*"%> <%@ page import="java.net.*"%> <%@ page import="java.lang.*"%

我的软件中有TREEVIEWS和数据库关联,可是我如何添加其子节点呢,能给个代码吗,

问题描述 我的软件中有TREEVIEWS和数据库关联,可是我如何添加其子节点呢,能给个代码吗, 解决方案 解决方案二:..._Click(...{stringselectedValue=TreeView1.SelectedNode.Value;//从数据库读取子节点//...//...foreach(DataRowrowinMyDataTable.Rows){TreeNodenewNode=newTreeNode();newNode.Text=row["MyField1"].ToStr

如何实现添加子节点时只能添加三级

问题描述 使用的是Jqueryeasyuitree,现在是可以无限制添加,怎么才能实现添加子节点时只能添加三级

E4X教程[2] - 访问 XML 子节点

访问 XML 子节点 JavaScript 对象通常使用 . 或 [] 来设置性质. var a = {}; a.foo = 1; a["bar"] = 2; 在 E4X 中,点(.)和中括号([])操作符用来访问 E4X 元素的子节点. var element1 = <foo> <bar/> </foo>; var element2 = <baz/>; element1.bar.appendChild(element2); elemen

jquery ajax解析XML文件数据方法详解

第一种方案:  代码如下 复制代码 <script type="text/javascript"> $(document).ready(function() {  $.ajax({     url: '/cgi/test.xml',     dataType: 'xml',     success: function(data){      //console.log(data);     $(data).find("channel").find(&qu

android编程之xml文件读取和写入方法_Android

本文实例讲述了android编程之xml文件读取和写入方法.分享给大家供大家参考.具体分析如下: 一.环境: 主机:WIN8 开发环境:Eclipse 二.说明: 1.打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置 2.读取xml文件 三.xml文件格式: <?xml version="1.0" encoding="UTF-8" standalone="true"?> -<config> <titl

XMLTextReader和XmlDocument读取XML文件的比较

xml|比较 看到网上一片文章,自己式了一下,果然 XMLTextReader速度要快! 在.NET框架的System.XML名称空间中包含的XMLTextReader类不需要对系统资源要求很高,就能从XML文件中快速读取数据.使用XMLTextReader类能够从XML文件中读取数据,并且将其转换为HTML格式在浏览器中输出.   读本文之前,读者需要了解一些基本知识:XML.HTML.C#编程语言,以及.NET尤其是ASP.NET框架的一些知识. 微软公司的.NET框架为开发者提供了许多开发

treeview-MFC中 解析XML文件,并用tree control 显示,如何进行对xml文件的增删改查?

问题描述 MFC中 解析XML文件,并用tree control 显示,如何进行对xml文件的增删改查? 如题,我利用tree control 显示了一个xml文件,然而不知道如何进行修改数据,就是点击了树形结构的节点,但是不知道如何定位点击的节点位置在原xml文件的位置? 解决方案 http://www.codeproject.com/Articles/11244/XML-TreeView-Control 解决方案二: simpleXML怎样解析一个xml文件,并对xml进行增删改查 过程Li