zoukankan      html  css  js  c++  java
  • 重温XML

    关于什么是XML,以及XML有什么作用,网络上很多,我就在这里不班门弄斧,写博客,是我的一个习惯,究其内容无非个人情感,心得体会,转载,技术相关的,或者一时心血来潮的个人之谈,但是我是一个小心翼翼的人,唯恐博文中出现什么纰漏差错,误导大家,被贻笑大方,但是我相信,无论对错,都会引起大家的共鸣,没有错误也是在所难免,毕竟水平有限,但是我尽力。

    <?xml version="1.0" encoding="utf-8" ?>
    <StudentList>
      <Student id="1">
        <Name>Tim</Name>
      </Student>
      <Student id="2">
        <Name>Tom</Name>
      </Student>
      <Student id="3">
        <Name>Vina</Name>
      </Student>
      <Student id="4">
        <Name>Emily</Name>
      </Student>
    </StudentList>
    

     上面的是我的一个例子,我的目的是要读取Tim这个值,我们先来分析一下Tim包含在id为1的Student元素的Name节点内,但是当我用下面的代码读取的时候去出现了错误。

     

      XmlDocument pXMLDoc = new XmlDocument();
    
    
    
                pXMLDoc.Load(@"XMLTest.xml");
                XmlNode XrootNode = pXMLDoc.SelectSingleNode("StudentList");
    
                string N1 = XrootNode.ChildNodes[0].Attributes[0].Name;
    
                string N2 = XrootNode.ChildNodes[0].Attributes[0].Value;
                string N3 = XrootNode.ChildNodes[0].ChildNodes[0].Value;
    

     N3就是我预想的值,但是获取后发现这个值是null,也就是说出现了问题,当然问题肯定是出现的我的身上,想了想,将最后一句换成下面这句就可以

      string N3 = XrootNode.ChildNodes[0].ChildNodes[0].InnerText;
    

    关于InnerText,MSDN上有详细的说明:

    获取或设置节点及其所有子节点的串联值(http://msdn.microsoft.com/zh-cn/library/system.xml.xmlnode.innertext.aspx)。 我们不难看出所谓的innerText是将从该节点以及其子节点的所有值连接在一起。也就是说InnerText的值不一定就是我们想要的值,MSDN上也说了:对于叶节点,InnerTextValue 属性返回相同的内容。

    这里其实有一个概念我一直没搞清,我开始的时候就以为Tim就是Name节点的值,其实错了,Tim也是一个节点也就是MSDN上所说的叶节点,所以可以通过下面的代码也可以获取正确的值。

     

      XmlDocument pXMLDoc = new XmlDocument();
    
    
    
                pXMLDoc.Load(@"XMLTest.xml");
                XmlNode XrootNode = pXMLDoc.SelectSingleNode("StudentList");
    
                string N1 = XrootNode.ChildNodes[0].Attributes[0].Name;
    
                string N2 = XrootNode.ChildNodes[0].Attributes[0].Value;
    
                string N3 = XrootNode.ChildNodes[0].ChildNodes[0].ChildNodes[0].Value;

     

     在XML中有很多节点,只不过类型不同而已,对于下面的这个例子:

    <?xml version="1.0"?>
      <books>
        <book>
            <author>Carson</author>
            <price format="dollar">31.95</price>
            <pubdate>05/01/2001</pubdate>
        </book>
        <pubinfo>
            <publisher>MSPress</publisher>
            <state>WA</state>
        </pubinfo>
      </books> 
    

     我们可以分析其DOM树,如下图:

    XML 文档结构

     

    在MSDN中对Nodel类型有很详细的描述(http://msdn.microsoft.com/zh-cn/library/system.xml.xmlnodetype(VS.95).aspx)

    成员


     成员名称说明
    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 None 如果未调用 Read 方法,则由 XmlReader 返回。
    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 Element 元素(例如,<item>)。

    Element 节点可以具有以下子节点类型:ElementTextCommentProcessingInstructionCDATAEntityReference 它可以是 DocumentDocumentFragmentEntityReferenceElement 节点的子级。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 Attribute 属性(例如,id='123')。

    Attribute 节点可以具有以下子节点类型:TextEntityReference Attribute 节点不以任何其他节点类型子节点的形式出现。 不将其视为 Element 的子节点。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 Text 节点的文本内容。

    Text 节点不能具有任何子节点。 它可以以 AttributeDocumentFragmentElementEntityReference 节点的子节点的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 CDATA CDATA 节(例如,<![CDATA[my escaped text]]>)。

    CDATA 节用于转义否则将被识别为标记的文本块。 CDATA 节点不能有任何子节点。 它可以以 DocumentFragmentEntityReferenceElement 节点子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 EntityReference 实体引用(例如,&num;)。

    EntityReference 节点可以具有以下子节点类型:ElementProcessingInstructionCommentTextCDATAEntityReference 它可以以 AttributeDocumentFragmentElementEntityReference 节点子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 Entity 实体声明(例如,<!ENTITY...>)。

    Entity 节点可以具有表示已展开实体的子节点(例如 TextEntityReference 节点)。 它可以以 DocumentType 节点子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 ProcessingInstruction 处理指令(例如,<?pi test?>)。

    ProcessingInstruction 节点不能具有任何子节点。 它可以以 DocumentDocumentFragmentElementEntityReference 节点子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 Comment 注释(例如,<!-- my comment -->)。

    Comment 节点不能有任何子节点。 它可以以 DocumentDocumentFragmentElementEntityReference 节点子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 Document 作为文档树的根的文档对象提供对整个 XML 文档的访问。

    Document 节点可以具有以下子节点类型:XmlDeclarationElement(最多一个)、ProcessingInstructionCommentDocumentType 它不能以任何节点类型子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 DocumentType 由以下标记指示的文档类型声明(例如,<!DOCTYPE...>)。

    DocumentType 节点可以具有以下子节点类型:NotationEntity 它可以以 Document 节点子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 DocumentFragment 文档片段。

    DocumentFragment 节点将节点或子树与文档关联起来,而实际上并不包含在该文档中。 DocumentFragment 节点可以具有以下子节点类型:ElementProcessingInstructionCommentTextCDATAEntityReference 它不能以任何节点类型子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 Notation 文档类型声明中的表示法(例如,<!NOTATION...>)。

    Notation 节点不能具有任何子节点。 它可以以 DocumentType 节点子级的形式出现。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 Whitespace 标记间的空白。
    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 SignificantWhitespace 混合内容模型中标记间的空白或 xml:space="preserve" 范围内的空白。
    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 EndElement 末尾元素标记(例如,</item>)。

    XmlReader 到达元素的末尾时,返回 EndElement 节点。

    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 EndEntity 由于调用 ResolveEntity 而使 XmlReader 到达实体替换的末尾时返回。
    受 Silverlight for Windows Phone 支持受 Xbox 360 支持 XmlDeclaration XML 声明(例如,<?xml version='1.0'?>)。

    XmlDeclaration 节点必须是文档中的第一个节点。 它不能具有子级。 它是 Document 节点的子级。 它可以具有提供版本和编码信息的属性。

    希望通过这个简短的描述和我自己对XML的认识给大家带来帮助。

    推荐博客:C# 解析XML http://blog.csdn.net/itwit/article/details/6689313

                  CDATA C# 操作 http://www.cnblogs.com/xyzhuzhou/archive/2012/08/29/2661840.html

  • 相关阅读:
    Shiro认证过程?
    使用过Redis做异步队列么,你是怎么用的?
    使用 Spring Boot有什么好处
    Spring Boot、Spring MVC 和 Spring 有什么区别?
    es
    python并发编程
    Go基础05
    Go04基础
    Go03基础
    Go基础02
  • 原文地址:https://www.cnblogs.com/zuiyirenjian/p/3188895.html
Copyright © 2011-2022 走看看