zoukankan      html  css  js  c++  java
  • XML学习笔记(三)进阶篇

    Preface:本文是W3Schools上《XML指南》进阶篇的学习笔记。其中大部分内容是对指南的翻译总结。由于原文的例子更详尽生动,如果各位想阅读原文可以到这个网址http://www.w3schools.com/xml/default.asp。同时,W3Schools提供了测试,大家可以测测自己对XML的理解程度。

    一、NameSpaces(命名空间)

            说到NameSpaces我们很快会联想到.Net的命名空间。是的,XML是可扩展的是由开发者定义的,所以相同的标记会有不同的含义。如果将这些标记混合在一起,XmlParser无法去识别他们之间的区别。我们尝试从不同的XML应用读取XML时也会引起混乱。

            解决的直接的思路是使用一个前缀。可以在每个标记前面加一个前缀作区分。而当我们使用前缀的时候,我们必须为前缀做一个Namespaces的声明调用。Namespaces是作为一个xmlns的Attribute调用的。语法如下xmlns:prefix="URI"。例子:

    <root>
    <h:table xmlns:h="http://www.w3.org/TR/html4/">
       
    <h:tr>
       
    <h:td>Apples</h:td>
       
    <h:td>Bananas</h:td>
       
    </h:tr>
    </h:table>
    <f:table xmlns:f="http://www.w3schools.com/furniture">
       
    <f:name>African Coffee Table</f:name>
       
    <f:width>80</f:width>
       
    <f:length>120</f:length>
    </f:table>
    </root> 

            为一个元素定义了Namespace则它的所有的子元素都会使用相同的Namespace。因此Namespace可以定义在root元素中。

    <root
    xmlns:h="http://www.w3.org/TR/html4/"
    xmlns:f
    ="http://www.w3schools.com/furniture">
    <h:table>
       
    <h:tr>
       
    <h:td>Apples</h:td>
       
    <h:td>Bananas</h:td>
       
    </h:tr>
    </h:table>
    <f:table>
       
    <f:name>African Coffee Table</f:name>
       
    <f:width>80</f:width>
       
    <f:length>120</f:length>
    </f:table>
    </root>
            一般我们使用URL作为NameSpace。但是Parser并不会从中读取任何信息。使用URL只是为了NameSpace的唯一性。当然,人们可以通过URL提供的网址寻找相关的信息。

            为了简化前缀,我们可以定义默认的命名空间(Default Namespaces)。语法是:xmlns="namespaceURI"。例子:

    <table xmlns="http://www.w3schools.com/furniture">
       
    <name>African Coffee Table</name>
       
    <width>80</width>
       
    <length>120</length>
    </table> 

            一个说明Namespaces的最好例子是XSLT。XSLT是一种XML语言。XSLT用来把XML文件转换成另一种格式,如HTML。下面是一个XSLT文件,你可以看到大部分是HTML标记,而同时有一部分标记使用xsl为前缀的标记。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl
    ="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <html>
    <body>
      
    <h2>My CD Collection</h2>
      
    <table border="1">
        
    <tr>
          
    <th align="left">Title</th>
          
    <th align="left">Artist</th>
        
    </tr>
        
    <xsl:for-each select="catalog/cd">
        
    <tr>
          
    <td><xsl:value-of select="title"/></td>
          
    <td><xsl:value-of select="artist"/></td>
        
    </tr>
        
    </xsl:for-each>
      
    </table>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet> 

    二、XML CDATA

            在XML文档中的所有Text都会被Parser进行分析,除了在CDATA中的文本。
    PCDATA:Parsed Character Data,是能够被Parser分析的XML文本数据。
    CDATA:(Unparsed)Character Data,是不为Parser所分析的XML文本数据。

            在CDATA可以包含一些可能会引起错误的符号。例如如果一个Element包含有“<”和“>”将会引起Parser的错误。因此可以将它包含在CDATA中。CDATA以“<![CDATA[”开始;以“]]>”结束。

    下面是一个例子:
    <script>
    <![CDATA[
    function matchwo(a,b)
    {
    if (a < b && a < 0) then
       {
       return 1;
       }
    else
       {
       return 0;
       }
    }
    ]]>
    </script> 

    注意:
    CDATA的文本中不能包含有“]]>”字符串。而结束标记“]]>”符号之间不能包含有空格。

    三、XML编码(Encoding)

            XML文档可以包含非ASCII的字符。例如挪威语、法语之中的符号。这时为了避免错误,应该指定XML文档的编码,并且以Unicode的方式保存XML文档。同时应该在XML文档中使用“encoding”属性予以说明。
    <?xml version="1.0" encoding="UTF-16"?>

            XML编码错误(Encoding Errors):在加载XML文档的时候,常见的XML编码错误有两种:

    “An invalid character was found in text content.”
    产生原因:XML文档包括了非ASCII字符,并且文件以单字节(single-byte)ANSI或ASCII方式保存,而且没有在XML中指定编码编码。

    “Switch from current encoding to specified encoding not supported”
    产生原因1:XML文档以双字节(double-byte)Unicode或UTF-16的方式保存,但是却制定了单字节的编码方式(如Windows-1252, ISO-8859-1, UTF-8等)。
    产生原因2:以单字节的ANSI或ASCII的方式保存文档,但却在XML文件中指定编码方式为UTF-16。

            Windows记事本: 很多时,我们会用WindowsNotepad编辑XML文档。这里要注意的是: WindowsNotepad默认将文档以单字节ANSI(ASCII)的方式保存。 如果要保存为双字节的Unicode(UTF-16),则要使用“另存为”保存。

    为了避免错误,关于XML Encoding的建议是:
    • 总是在XML中使用encoding属性。
    • 使用一个支持编码的编辑器。
    • 确认你知道编辑器的编码方式。
    • 使你的encoding属性的值符合编码。

    四、XML 服务器

            和HTML一样XML文件是纯文本。一个标准的Web服务器和以很方便的存储和生成XML文件。所以很多的Web服务器都有提供操作XML的API。具体各种不同的技术是如何实现的,就不能在这里说明了。

    五、XML DOM 进级

    详细的DOM学习还是要参考XML DOM指南和手册。这里列出常见的操作。
    获取元素的值
    x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
    txt=x.nodeValue; 

    获取属性的值
    txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");

    改变元素的值
    x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
    x.nodeValue="Easy Cooking";

    改变属性的值
    x=xmlDoc.getElementsByTagName("book");
    for(i=0;i
    <x.length;i++)
    {
    x[i].setAttribute("edition","first");
    }

    创建一个元素
    newel=xmlDoc.createElement("edition");
    newtext=xmlDoc.createTextNode("First");
    newel.appendChild(newtext);x=xmlDoc.getElementsByTagName("book");
    x[0].appendChild(newel);

    移除一个元素
    x=xmlDoc.getElementsByTagName("book")[0];
    x.removeChild(x.childNodes[0]); 

    六、XML要避免的技术

    Internet Explorer XML Data Islands
    What is it?
    这是一种将XML数据嵌入到HTML页面的技术。
    Why avoid it?
    因为这时IE的特有技术,其他的Browser不支持。
    What to use instead?
    应该使用JavaScript和XML DOM在HTML中展示XML数据。

    Internet Explorer Behaviors
    What is it?
    IE5引入了动作的概念(Behaviors)。Behaviors是结合CSS为XML(或HTML)元素添加动作样式的技术。
    Why avoid it?
    只有IE支持
    What to use instead?
    同样应该使用JavaScript和XML DOM进行实现。

    因为指南已经叫我们避免使用这两种技术,就没必要深入了解他们了。

    七、XML 相关技术

    下面的连接中列出了XML相关的技术。http://www.w3schools.com/xml/xml_technologies.asp

    八、XML的实际应用

    XML News
    XMLNews是一种交换新闻和信息的规范。

    XML Weather Service
    National Oceanic and Atmospheric Administration是其中一个天气服务的例子。

    九、XML编辑器(Editors)

            XML是纯文本的,所以使用一般的文本编辑器就可以编辑XML了。但是使用一个专业的XML编辑器,比使用记事本(Notepad)有更多的优点。

            为什么不用Notepad?是的大多数的OS都有Notepad。很容易使用它来进行HTML、XML、CSS的编辑。但是请尽量不要使用Notepad,因为Notepad并不知道你在编辑的是HTML、XML或CSS文件,它也无法,不会提供帮助。

            为什么使用XML编辑器?专业的XML编辑器可以更好的保证无错的文档。可以根据DTD或Schema,保证XML的有效性(Validate)。我们应该使用提供以下功能的专业XML编辑器:

    • 能够自动添加闭合标记。
    • 强制你写有效XML。
    • 能根据DTD或Schema验证XML。
    • 为你的XML按照语法添加颜色区别。

    十、下一步应该学习什么?

            下一步的学习应该是XML DOM和XSLT。如果你比较关心XML的有效性验证,那么可以学习DTD和Schema。


    本文为个人原创,转载请注明出自:http://jackma.cnblogs.com/ 
    Author:JackMa

  • 相关阅读:
    如何得到需要下载文件的链接(路径)?
    Python之内存泄漏和内存溢出
    IO多路复用
    python-socket和进程线程协程(代码展示)
    Xshell(远程)连接不上linux服务器(防火墙介绍)
    Shell--变量
    Python读写配置文件模块--Configobj
    python文件处理之fileinput
    python之commands和subprocess入门介绍(可执行shell命令的模块)
    linux下 > /dev/null 2 > &1 的意思和如何在后台启动进程
  • 原文地址:https://www.cnblogs.com/JackMa/p/1070545.html
Copyright © 2011-2022 走看看