none
关于xml的SelectSingleNode的问题 RRS feed

  • 问题

  • 现有一个要被解析的xml局部如下:

    - <dsobject classname="Rendition">
    - <contentelements>
      <contentelement>Tansion</contentelement> 
      </contentelements>
    </dsobject>
    
    - <dsobject classname="Rendition">
    - <contentelements>
      <contentelement>Herry</contentelement> 
      </contentelements>
    </dsobject>
    
    - <dsobject classname="Rendition">
    - <contentelements>
      <contentelement>Jack</contentelement> 
      </contentelements>
    </dsobject>

    我希望迭代每个标签为<contentelement>的Innertext,却只能迭代出第一个。代码如下:

    foreach (XmlNode item in document.SelectNodes("//dsobject[@classname='Rendition']")) { XmlNode oneNode = item.SelectSingleNode("//contentelement"); string inner = oneNode.InnerText;

    }

    结果每个inner的值都为第一个元素的文本节点,即"Tansion"。

    请问如何迭代全部出来呢?



    2012年5月13日 10:55

答案

  •  XmlDocument document = new XmlDocument();
                    document.Load("XMLFile1.xml");
                    foreach (XmlNode item in document.SelectNodes("//dsobject[@classname='Rendition']"))
                    {
                        XmlNode oneNode = item.ChildNodes[0].ChildNodes[0];
    //或者:XmlNode oneNode = item.SelectSingleNode("contentelements/contentelement"); string inner = oneNode.InnerText; Console.WriteLine(inner); }

    你的错误原因:SelectSingleNode需要一个XPath解析工具。但是如果你使用//,那么其就是从整个文档进行搜索匹配,而不会从当前的item搜索,SingleNode又只会搜索出满足条件的第一个,因此总是输出Tansion。

    另外,你的xml没有根节点,这样修改。

    <root>
      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Tansion</contentelement>
        </contentelements>
      </dsobject>

      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Herry</contentelement>
        </contentelements>
      </dsobject>

      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Jack</contentelement>
        </contentelements>
      </dsobject>
    </root>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月13日 11:17
    版主

全部回复

  •  XmlDocument document = new XmlDocument();
                    document.Load("XMLFile1.xml");
                    foreach (XmlNode item in document.SelectNodes("//dsobject[@classname='Rendition']"))
                    {
                        XmlNode oneNode = item.ChildNodes[0].ChildNodes[0];
    //或者:XmlNode oneNode = item.SelectSingleNode("contentelements/contentelement"); string inner = oneNode.InnerText; Console.WriteLine(inner); }

    你的错误原因:SelectSingleNode需要一个XPath解析工具。但是如果你使用//,那么其就是从整个文档进行搜索匹配,而不会从当前的item搜索,SingleNode又只会搜索出满足条件的第一个,因此总是输出Tansion。

    另外,你的xml没有根节点,这样修改。

    <root>
      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Tansion</contentelement>
        </contentelements>
      </dsobject>

      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Herry</contentelement>
        </contentelements>
      </dsobject>

      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Jack</contentelement>
        </contentelements>
      </dsobject>
    </root>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月13日 11:17
    版主
  •  XmlDocument document = new XmlDocument();
                    document.Load("XMLFile1.xml");
                    foreach (XmlNode item in document.SelectNodes("//dsobject[@classname='Rendition']"))
                    {
                        XmlNode oneNode = item.ChildNodes[0].ChildNodes[0];
                        string inner = oneNode.InnerText;
                        Console.WriteLine(inner);
                    }

    另外,你的xml没有根节点,这样修改:

    <root>
      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Tansion</contentelement>
        </contentelements>
      </dsobject>

      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Herry</contentelement>
        </contentelements>
      </dsobject>

      <dsobject classname="Rendition">
        <contentelements>
          <contentelement>Jack</contentelement>
        </contentelements>
      </dsobject>
    </root>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    您的办法不错,但由于我把xml文档说得太简单,所以这个办法不太适合我,xml文档详细如下:

    - <dsobject classname="Rendition">
    - <props>
    ...........(以下内容省略)...........
     </props>
    - <sourcelinks>
    ...........(以下内容省略)...........
    </sourcelinks>
    - <destinationlinks>
    ...........(以下内容省略)...........
      </destinationlinks>
    - <acls>
    ...........(以下内容省略)...........
    </acls>
    - <contentelements>
      <contentelement>Tansion</contentelement> 
      </contentelements>
    </dsobject>
    //-----------------------------------------------------
    - <dsobject classname="Rendition">
    - <props>
    ...........(以下内容省略)...........
     </props>
    - <sourcelinks>
    ...........(以下内容省略)...........
    </sourcelinks>
    - <destinationlinks>
    ...........(以下内容省略)...........
      </destinationlinks>
    - <acls>
    ...........(以下内容省略)...........
    </acls>
    - <contentelements>
      <contentelement>Herry</contentelement> 
      </contentelements>
    </dsobject>
    //-----------------------------------------------------
    - <dsobject classname="Rendition">
    - <props>
    ...........(以下内容省略)...........
     </props>
    - <sourcelinks>
    ...........(以下内容省略)...........
    </sourcelinks>
    - <destinationlinks>
    ...........(以下内容省略)...........
      </destinationlinks>
    - <acls>
    ...........(以下内容省略)...........
    </acls>
    - <contentelements>
      <contentelement>Jack</contentelement> 
      </contentelements>
    </dsobject>
    而且其实里面还嵌入了更多的节点,如果现在使用ChildNodes带索引的方法的话,好像比较麻烦。现在又该如何改进呢?

    2012年5月13日 11:33
  • 版主,我很佩服您解决问题能这么干净利索。请教下关于XPath这方面的知识,您能提供个比较简明实用的资料给我学习吗?
    2012年5月13日 12:14
  • 呵呵,不用了,刚有人给了我一份很好的资料。向版主学习了。
    2012年5月13日 12:33
  • 版主,我很佩服您解决问题能这么干净利索。请教下关于XPath这方面的知识,您能提供个比较简明实用的资料给我学习吗?

    不用谢,关于XPath可以参考:

    1)W3c School:http://www.w3school.com.cn/xpath/index.asp

    2)我的博客部分:http://www.cnblogs.com/ServiceboyNew/archive/2012/05/13/2498444.html


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月14日 1:24
    版主
  • 版主,我很佩服您解决问题能这么干净利索。请教下关于XPath这方面的知识,您能提供个比较简明实用的资料给我学习吗?

    不用谢,关于XPath可以参考:

    1)W3c School:http://www.w3school.com.cn/xpath/index.asp

    2)我的博客部分:http://www.cnblogs.com/ServiceboyNew/archive/2012/05/13/2498444.html


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    谢谢了!
    2012年5月21日 9:49
  • 不用谢,欢迎常来MSDN交流技术,帮助别人!

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月22日 1:35
    版主