首页 新闻 搜索 专区 学院

解析Xml 进来看看

0
悬赏园豆:20 [已解决问题] 解决于 2014-07-26 09:56

我现在要写一个解析任何Xml的方法,求指导,现在思路很混乱。。。

问题补充:

我是用C#

过客丶的主页 过客丶 | 初学一级 | 园豆:13
提问于:2014-07-24 09:34
< >
分享
最佳答案
0

C#自己就有解析xml的方法呀。

你可以用XMLElement。。

示例:

XmlDocument doc=new XmlDocument();

doc.Load(@".\xx.xml");

XmlNode node=doc.SelectSingleNode("NodeA");

 

node 中就包含了 xx.xml 文件中的第一个 NodeA 节点的所有内容了。。比如要看属性就是 node.GetAttribute("Att");

收获园豆:20
Leaco | 菜鸟二级 |园豆:233 | 2014-07-24 15:23

  有些的Xml是没有属性的   有些的又有很多属性     如何获取未知Xml里面的属性名? 如何判读未知Xml是否有属性  有几个属性?

过客丶 | 园豆:13 (初学一级) | 2014-07-24 15:38

@过客丶:  很简单啊, 上面你得到的  node.Attributes 就包含了所有该节点的属性集合了。。

通过判断 node.Attributes 是否为空,就能知道该节点有没有属性,

通过 node.Attributes[index].ToString() 就能拿到属性的string名称

Leaco | 园豆:233 (菜鸟二级) | 2014-07-24 15:50

@Leaco: 

XmlDocument doc1 = new XmlDocument();
            doc1.Load(filePath);
            XmlNode root1 = (XmlNode)doc1.DocumentElement;
            XmlNode node1 = doc.SelectSingleNode(root1.FirstChild.Name);

node1 得到的是空值,root1.FirstChild.Name  这个能取到值。  这段代码哪里错了吗?

过客丶 | 园豆:13 (初学一级) | 2014-07-24 15:59

@过客丶: 你应该这么写:

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 | 园豆:233 (菜鸟二级) | 2014-07-24 16:06

@Leaco: 

 还是获取不到   仍然是null 。

过客丶 | 园豆:13 (初学一级) | 2014-07-24 16:15

@过客丶: 你把你的xml文件贴出来我看看呢?还有具体你要拿什么属性,什么节点。你先看看root1 是不是 null。  最重要的一点, 你看看你的 xml 最上方有没有 <?xml version="1.0" encoding="utf-8"?> 没有的话必须加上才行。

Leaco | 园豆:233 (菜鸟二级) | 2014-07-24 16:19

@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就是上面的值

过客丶 | 园豆:13 (初学一级) | 2014-07-24 16:24

@Leaco: 

doc.SelectSingleNode("NodeA");  这个参数应该不能这么写吧

过客丶 | 园豆:13 (初学一级) | 2014-07-24 16:30

@过客丶: 举个例子,比如我要获取 第一个 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 | 园豆:233 (菜鸟二级) | 2014-07-24 16:33

@Leaco: 

要是 root  province name  这些属性  节点我们都不知道 怎么弄

过客丶 | 园豆:13 (初学一级) | 2014-07-24 16:36

@Leaco: 

就是说我们已经都不知道Xml有上面属性 节点  就算知道也不能去改代码

过客丶 | 园豆:13 (初学一级) | 2014-07-24 16:40

@过客丶: 也很简单啊。

引用之前的代码:

            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 | 园豆:233 (菜鸟二级) | 2014-07-24 16:44

@Leaco:

root

  province 

    city

      area

我可以得到这个结构     这样应该就能搞定了

过客丶 | 园豆:13 (初学一级) | 2014-07-24 16:56

@过客丶: 就是说你只要拿到上面的几个名字就可以了?使用root1.ChildNode 和 root1.Name; 然后再弄个函数遍历下就可以了嘛。

Leaco | 园豆:233 (菜鸟二级) | 2014-07-24 17:05
其他回答(4)
0
Launcher | 园豆:45045 (高人七级) | 2014-07-24 09:40
0

这个"任何"怎么定义

 

XML 不就只是一种文件格式

Yu | 园豆:12944 (专家六级) | 2014-07-24 10:26

  就是随便传一个Xml文件都能解析  而不是规定解析哪一个Xml文件  不管Xml文件的大小  里面的内容

支持(0) 反对(0) 过客丶 | 园豆:13 (初学一级) | 2014-07-24 10:34

@过客丶: 了解一下 

 

HtmlAgilityPack 和 XPath

支持(0) 反对(0) Yu | 园豆:12944 (专家六级) | 2014-07-24 10:39
0

linqtoxml,解析所有xml就想太多了.直接用直接微软xml类库就是你这所谓的所有热Xml都能解析了

吴瑞祥 | 园豆:28820 (高人七级) | 2014-07-24 10:49
0

递归就可以遍历XML了。xml是什么格式不是很重要,只要是正确的XML格式就行,问题是你想要解析成什么样的格式。

Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-07-24 17:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册