XML,DTD和XSD

XML构建模块:

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素、属性、实体、PCDATA、CDATA
<body src="computer.gif">body text in between</body>

这是一个body元素,元素可拥有文本内容和属性 、属性总是以名称/值的形式成对出现,属性值要加引号,不过单引号和双引号均可使用 。

XML中有以下五个预定义实体:当我们需要在文本中表示<时,就需要转义,不然会破坏XML结构。

当文档被 XML 解析器解析时,实体就会被翻译。

实体引用字符
&lt;<
&gt;>
&amp;&
&quot;"
&apos;

PCDATA 的意思是被解析的字符数据(parsed character data)。 一般就是XML元素的文本。PCDATA 是会被解析器解析的,解析器会解析标签,检查实体并转义实体。

比如<body>abc&lt;img&gt;d</body> 里面的lt和gt实体会被翻译,当作纯数据展示,不会破坏xml结构。

CDATA 的意思是字符数据(character data)。不会被解析器解析。

某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。转义成实体太麻烦,不转义又会破坏xml结构,为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分由 “<![CDATA[**" 开始,由 "**]]>” 结束,里面的所有内容都会被解析器忽略:

//页面上插入js语句
<script>
<![CDATA[
function matchwo(a,b){
    if (a < b && a < 0) then {
        return 1;
    } else {
        return 0;
    }
}
]]>
</script>

//mybatis xml中的CDATA
<if test="endDate != null and endDate != ''">
    <![CDATA[and DATE_FORMAT(CREATE_DATA,"%Y-%m-%d") <= #{endDate}]]>
</if>

在 XML 中,多个连续的空格会被保留。XML 以 LF 存储换行。

DTD:

DTD(文档类型定义)主要用来描述xml文档的结构。用于验证自身或外部接收到的数据的正确性。DTD可以被XML文件本身直接包含或者通过外部引用进入XML。

以下是一个自身带有DTD的XML文档例子:

<?xml version="1.0"?>
<!DOCTYPE note [   //定义此文档是 note 类型的文档
  <!ELEMENT note (to,from)>  //定义根元素含有的子元素
  <!ELEMENT to      (#PCDATA)>  //定义 to 元素为 "#PCDATA" 类型
  <!ELEMENT from    (#PCDATA)>  
]>
<note>
  <to>George</to>
  <from>John</from>
</note>

或者DTD可以通过外部引入:

<!DOCTYPE note SYSTEM "note.dtd">

note.dtd:

  <!ELEMENT note (to,from)>  //定义根元素含有的子元素
  <!ELEMENT to      (#PCDATA)>  //定义 to 元素为 "#PCDATA" 类型
  <!ELEMENT from    (#PCDATA)>  

schema:

XML Schema 语言也称作 XSD(XML Schema Definition)。 它本身是一个XML文件,并且是DTD的继任者。

下面这个例子是一个名为 “note.xsd” 的 XML Schema 文件 :

<?xml version="1.0"?>
<xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
//xmlns后面的值是要引用的xsd文件的命名空间,声明了xsd中用到的元素和数据类型来源,:xs还规定了该命名空间的前缀为xs。由于本文件是xsd文件,所以必定要引用http://www.w3.org/2001/XMLSchema这个xsd文件来定义元素。
           
targetNamespace="http://www.w3school.com.cn"  //每个xsd都有一个自己取的命名空间名字

xmlns="http://www.w3school.com.cn"  
//将本文件定义的元素也作为本文件的命名空间,其实一般在xsd文件中,也不会调用自己定义的元素,所以这行也可以不要
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:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

note 元素是一个复合类型,因为它包含其他的子元素。其他元素 (to, from, heading, body) 是简易类型,因为它们没有包含其他元素。

note.xsd被其他文件引用:

<?xml version="1.0"?>
<note
xmlns="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"
//给出命名空间对应的xsd网络或本地位置,才能进行校验 >

<to>George</to>
<from>John</from>
</note>

xmlns指定了命名空间,xsi:schemaLocation指定了命名空间对应的模式文档(xsd文件或dtd文件)的位置。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中使用 XSD 文件检测 XML 需要用到第三方库,比如 Xerces-C++。下面是使用 Xerces-C++ 库检测 XML 的步骤: 1. 安装 Xerces-C++ 库并包含其头文件。 2. 创建 XSD 文件,定义 XML 文档的结构和约束。 3. 创建 XML 文档并加载到内存中。 4. 创建 Xerces-C++ 的 DOM 解析器,并设置解析器的验证属性。 5. 创建 Xerces-C++ 的 DOM 文档对象,并将 XML 文档加载到该对象中。 6. 创建 Xerces-C++ 的 DOM 文档类型对象,并将 XSD 文件加载到该对象中。 7. 使用解析器解析 XML 文档,并将 XSD 文件作为第二个参数传递给解析器的 parse 方法。 8. 如果 XML 文档符合 XSD 文件中定义的约束,则它是有效的 XML 文档。如果不符合,则会出现错误或警告。 以下是使用 Xerces-C++ 库检测 XML 的示例代码: ``` #include <xercesc/dom/DOM.hpp> #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/util/XMLUni.hpp> #include <xercesc/framework/LocalFileInputSource.hpp> #include <iostream> using namespace xercesc; using namespace std; int main(int argc, char* argv[]) { try { XMLPlatformUtils::Initialize(); // 加载 XML 文档 XercesDOMParser parser; parser.parse("example.xml"); // 创建 DOM 文档对象 DOMDocument* doc = parser.getDocument(); // 创建 DOM 文档类型对象 DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("Core")); DOMDocumentType* type = impl->createDocumentType( XMLString::transcode("example"), XMLString::transcode("example.dtd"), XMLString::transcode("example.sys") ); // 创建解析器并设置验证属性 parser.setDoValidation(true); parser.setDoSchema(true); parser.setValidationSchemaFullChecking(true); // 解析 XML 文档并检测约束 parser.parse("example.xml"); if(parser.getErrorCount() == 0) { cout << "XML is valid." << endl; } else { cout << "XML is not valid." << endl; } XMLPlatformUtils::Terminate(); } catch(const XMLException& e) { cerr << "Error: " << XMLString::transcode(e.getMessage()) << endl; return 1; } return 0; } ``` 在此示例中,example.xml 是要验证的 XML 文档的名称,example.dtdXSD 文件的名称。如果 XML 文档符合 XSD 文件中定义的约束,则输出 "XML is valid.",否则输出 "XML is not valid."。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值