我现在要写一个解析任何Xml的方法,求指导,现在思路很混乱。。。
我是用C#
C#自己就有解析xml的方法呀。
你可以用XMLElement。。
示例:
XmlDocument doc=new XmlDocument();
doc.Load(@".\xx.xml");
XmlNode node=doc.SelectSingleNode("NodeA");
node 中就包含了 xx.xml 文件中的第一个 NodeA 节点的所有内容了。。比如要看属性就是 node.GetAttribute("Att");
有些的Xml是没有属性的 有些的又有很多属性 如何获取未知Xml里面的属性名? 如何判读未知Xml是否有属性 有几个属性?
@过客丶: 很简单啊, 上面你得到的 node.Attributes 就包含了所有该节点的属性集合了。。
通过判断 node.Attributes 是否为空,就能知道该节点有没有属性,
通过 node.Attributes[index].ToString() 就能拿到属性的string名称
@Leaco:
XmlDocument doc1 = new XmlDocument(); doc1.Load(filePath); XmlNode root1 = (XmlNode)doc1.DocumentElement; XmlNode node1 = doc.SelectSingleNode(root1.FirstChild.Name);
node1 得到的是空值,root1.FirstChild.Name 这个能取到值。 这段代码哪里错了吗?
@过客丶: 你应该这么写:
XmlDocument doc1 = new XmlDocument(); doc1.Load(filePath); XmlNode root1 = (XmlNode)doc1;
这个时候,root1已经是你根节点的值了,
比如,如果你的 xml 长这个样子:
<root att="test"> <node1 att="test1"/> </root>
那么你上面的代码,root1 拿到的就是 root 节点。
而selectSingleNode只能在同一级node 下进行查找,比如上面的 node1 是root 的子节点,那么你就只能是 root1.SelectSingleNode(root1.FirstChind.Name) 应该才能拿得到 node1节点
@Leaco:
还是获取不到 仍然是null 。
@过客丶: 你把你的xml文件贴出来我看看呢?还有具体你要拿什么属性,什么节点。你先看看root1 是不是 null。 最重要的一点, 你看看你的 xml 最上方有没有 <?xml version="1.0" encoding="utf-8"?> 没有的话必须加上才行。
@Leaco:
<?xml version="1.0" encoding="utf-8"?> <root name="中国" postcode="000000" > <province name="请选择省" postcode="100000" > <city name="请选择市" postcode="100100" > <area name="请选择区" postcode="100101" /> </city> </province> <province name="北京市" postcode="110000" > <city name="市辖区" postcode="110100" > <area name="东城区" postcode="110101" /> <area name="西城区" postcode="110102" /> <area name="崇文区" postcode="110103" /> <area name="宣武区" postcode="110104" /> <area name="朝阳区" postcode="110105" /> <area name="丰台区" postcode="110106" /> <area name="石景山区" postcode="110107" /> <area name="海淀区" postcode="110108" /> <area name="门头沟区" postcode="110109" /> <area name="房山区" postcode="110111" /> <area name="通州区" postcode="110112" /> <area name="顺义区" postcode="110113" /> <area name="昌平区" postcode="110114" /> <area name="大兴区" postcode="110115" /> <area name="怀柔区" postcode="110116" /> <area name="平谷区" postcode="110117" /> </city> <city name="县" postcode="110200" > <area name="密云县" postcode="110228" /> <area name="延庆县" postcode="110229" /> </city> </province> </root>
root1.InnerXml就是上面的值
@Leaco:
doc.SelectSingleNode("NodeA"); 这个参数应该不能这么写吧
@过客丶: 举个例子,比如我要获取 第一个 province 的name属性:
XmlDocument doc1 = new XmlDocument(); doc1.Load(filePath); XmlNode root1 = (XmlNode)doc1.SelectSingleNode("root"); XmlNode provinceNode= root1.SelectSingleNode("province"); string s= provinceNode.GetAttribute("name"); //s="请选择省"
@Leaco:
要是 root province name 这些属性 节点我们都不知道 怎么弄
@Leaco:
就是说我们已经都不知道Xml有上面属性 节点 就算知道也不能去改代码
@过客丶: 也很简单啊。
引用之前的代码:
XmlDocument doc1 = new XmlDocument(); doc1.Load(filePath); XmlNode root1 = (XmlNode)doc1; //root1.Attributes 取得根节点所有属性名 // root1.GetAttribute(root1.Attributes[i]); 取得第i个属性的值 // root1.ChildNode 列出了 root的下一级子节点、 //把下一级别子节点重复用上面的三个注释的方法就可以遍历出来了。。
BTW,你都完全不知道 xml 具体什么结构,还怎么谈解析啊。。或者说,不知道具体的节点,这样解析出来有什么用呢。。
@Leaco:
root
province
city
area
我可以得到这个结构 这样应该就能搞定了
@过客丶: 就是说你只要拿到上面的几个名字就可以了?使用root1.ChildNode 和 root1.Name; 然后再弄个函数遍历下就可以了嘛。
这个"任何"怎么定义
XML 不就只是一种文件格式
就是随便传一个Xml文件都能解析 而不是规定解析哪一个Xml文件 不管Xml文件的大小 里面的内容
@过客丶: 了解一下
HtmlAgilityPack 和 XPath
linqtoxml,解析所有xml就想太多了.直接用直接微软xml类库就是你这所谓的所有热Xml都能解析了
递归就可以遍历XML了。xml是什么格式不是很重要,只要是正确的XML格式就行,问题是你想要解析成什么样的格式。