XML 备忘

XML 备忘

 

1.XML命名空间

 

XML 命名空间(XML Namespaces) 

http://www.w3school.com.cn/xml/xml_namespaces.asp

 

XML学习笔记(一):XML中的命名空间  

http://www.cnblogs.com/martin-chen/archive/2011/02/24/xml-studynote-namespace.html

 

总结,xml命名空间可以出现在元素中,用于解决冲突,即,相同的元素,

如果属于不同的命名空间则可以表示不同含义,不存在冲突.

比如

<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>

这里,使用了命名空间h,

<f:table xmlns:f="http://www.w3school.com.cn/furniture">

   <f:name>African Coffee Table</f:name>

   <f:width>80</f:width>

   <f:length>120</f:length>

</f:table>

这里使用了f,两个都是table,但是属性不同.

 

XML Namespace (xmlns) 属性

XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

xmlns:namespace-prefix="namespaceURI"

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

后面的namespaceURI只是用来表示唯一的,xml文档不会真的去访问这个uri.

 

一个元素可以定义一个默认的命名空间,这样该元素(及其所有子元素)的元素名称可以不写前缀.

默认的命名空间(Default Namespaces)

为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。

请使用下面的语法:

xmlns="namespaceURI"

这个 XML 文档携带着某个表格中的信息:

<table xmlns="http://www.w3.org/TR/html4/">

   <tr>

   <td>Apples</td>

   <td>Bananas</td>

   </tr>

</table>

这样table就可以不用写前缀了.

 

另外,一个元素里面可以有一个默认命名空间,和多个非默认命名空间

命名空间可以在任何元素中定义,通常在根元素中定义,这样定义一次所有

元素都可以使用命名空间了.

 

2. XML 的schema

参考:http://www.w3school.com.cn/schema/schema_schema.asp

 

XML 的schema 也是一种XML格式的文件,这种文件用来定义XML文档的结构,包括控制XML元素和元素的属性等.

XML的schema文件一般保存为.xsd文件,这种文件中,

元素的命名空间,元素类型等必须符合W3C规范的约束.

因为这种约束,XML 的schema可以看成是一种定义XML文档结构的语言了.

 

比如 <schema> 元素是每一个 XML Schema 的根元素:

<?xml version="1.0"?>

 

<xs:schema>

 

...

...

 

</xs:schema>

 

<schema> 元素可包含属性。一个 schema 声明往往看上去类似这样:

<?xml version="1.0"?>

 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://www.w3school.com.cn"

xmlns="http://www.w3school.com.cn"

elementFormDefault="qualified">

 

...

...

</xs:schema>

代码解释:

下面的片断:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。

同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:

这个前缀可以定义为别的,不过一般默认就用xs:,不用修改.

 

这个片断:targetNamespace="http://www.w3school.com.cn" 

显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: "http://www.w3school.com.cn"

命名空间字符串只要唯一就行,不一定非要是网址的格式.

这个命名空间是引入该schema文件的xml中定义的,如何在xml文件中引入schema详见后文.

 

这个片断:xmlns="http://www.w3school.com.cn" 

指出本schema中,默认的命名空间是 "http://www.w3school.com.cn"。

 

这个片断:elementFormDefault="qualified" 

指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。

 

...

...

省略的部分表示具体定义的xml文档的结构,具体教程参考:

http://www.w3school.com.cn/schema/index.asp

 

下面是一个完整的.xsd文件定义的一个schema:

note.xsd

<?xml version="1.0"?>

<xs:schema 

  xmlns:xs="http://www.w3.org/2001/XMLSchema"

  targetNamespace="http://www.w3school.com.cn"

  xmlns="http://www.w3school.com.cn"

  elementFormDefault="qualified">

 

<xs:element name="note">

        <xs:complexType>

            <xs:sequence>

                <xs:element name="to" type="xs:string" />

                <xs:element name="from" type="xs:string" />

                <xs:element name="heading" type="xs:string" />

                <xs:element name="body" type="xs:string" />

            </xs:sequence>

        </xs:complexType>

    </xs:element>

</xs:schema>

 

下面是一个使用上面note.xsd来定义的xml文件,note.xml

<?xml version="1.0"?>

<qq:note

  xmlns:qq="http://www.w3school.com.cn"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

 

  <qq:to>George</qq:to>

  <qq:from>John</qq:from>

  <qq:heading>Reminder</qq:heading>

  <qq:body>Don't forget the meeting!</qq:body>

 

</qq:note>

注意,xmlns:qq="http://www.w3school.com.cn" 这里声明了一个命名空间,

和xsd文件中的targetNamespace是一致的.

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 这个是固定的,表示使用的验证规范

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"

这个把这里定义的命名空间xmlns:qq的uri和xsd文件关联起来,以便引入定义好的note.xsd文件

来约束note.xml的文档结构.

 

下面代码用于检查xml文件是否符合引入的xsd文件约束.

需要导入dom4j包.

 

package test.dbtool.utils;

 

import org.dom4j.Document;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.SAXReader;

import org.dom4j.io.SAXValidator;

import org.dom4j.io.XMLWriter;

import org.dom4j.util.XMLErrorHandler;

 

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import java.io.File;

 

/** 

* Java XML校验测试 

* @author leizhimin,2008-9-4 14:42:35 

*/

public class ValidataXMLTest

{

  public static void main(String[] args)

  {

    validateXMLByXSD();

    validateXMLByDTD();

 

  }

 

  /** 

   * 通过XSD(XML Schema)校验XML 

   */

  public static void validateXMLByXSD()

  {

    String xmlFileName = "D:\\E\\JSP\\Tool4DBJAXBDemo\\src\\note.xml";

    String xsdFileName = "D:\\E\\JSP\\Tool4DBJAXBDemo\\src\\note.xsd";

    try

    {

      // 创建默认的XML错误处理器

      XMLErrorHandler errorHandler = new XMLErrorHandler();

      // 获取基于 SAX 的解析器的实例

      SAXParserFactory factory = SAXParserFactory.newInstance();

      // 解析器在解析时验证 XML 内容。

      factory.setValidating(true);

      // 指定由此代码生成的解析器将提供对 XML 名称空间的支持。

      factory.setNamespaceAware(true);

      // 使用当前配置的工厂参数创建 SAXParser 的一个新实例。

      SAXParser parser = factory.newSAXParser();

      // 创建一个读取工具

      SAXReader xmlReader = new SAXReader();

      // 获取要校验xml文档实例

      Document xmlDocument = (Document) xmlReader.read(new File(xmlFileName));

      // 设置 XMLReader 的基础实现中的特定属性。核心功能和属性列表可以在 [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。

      parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");

      parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:" + xsdFileName);

      // 创建一个SAXValidator校验工具,并设置校验工具的属性

      SAXValidator validator = new SAXValidator(parser.getXMLReader());

      // 设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。

      validator.setErrorHandler(errorHandler);

      // 校验

      validator.validate(xmlDocument);

 

      XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());

      // 如果错误信息不为空,说明校验失败,打印错误信息

      if (errorHandler.getErrors().hasContent())

      {

        System.out.println("XML文件通过XSD文件校验失败!");

        writer.write(errorHandler.getErrors());

      }

      else

      {

        System.out.println("Good! XML文件通过XSD文件校验成功!");

      }

    }

    catch (Exception ex)

    {

      System.out.println("XML文件: " + xmlFileName + " 通过XSD文件:" + xsdFileName + "检验失败。\n原因: " + ex.getMessage());

      ex.printStackTrace();

    }

  }

 

  /** 

   * 通过DTD校验XML 

   */

  public static void validateXMLByDTD()

  {

    // todo:暂时不用,以后再说吧

  }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值