XML2

今天是XML的第二天

 

DTD内容模式的种类有:
EMPTY  元素不能包含任何数据,但可以有属性(前提是必须声明其属性)。
不能有子元素。不能有文本数据(包括空白,换行符)。
DTD中定义: <!ELEMENT elementName EMPTY>
XML中写:<elementName/>(推荐) 或者:<elementName></elementName>
 (#PCDATA)规定元素只包含已析的字符数据,而不包含任何类型的子元素的内容类型。
DTD中定义: <!ELEMENT student (#PCDATA)>
XML中合法内容: <student>watching TV</student>
 (Elements)元素由内容模式部件指定。
<!ELEMENT name (child particles) >
内容模式部件可以是下表列出的内容。
<!ELEMENT name (a,b)> 子元素a、b必须出现,且按照列表的顺序
<!ELEMENT name (a|b)> 选择;子元素a、b只能出现一个
<!ELEMENT name (a) > 子元素a只能且必须出现一次
<!ELEMENT name (a)+ > 子元素a出现一次或多次
<!ELEMENT name (a)* > 子元素a出现任意次(包括零次、一次及多次)
<!ELEMENT name (a)? > 子元素a出现一次或不出现
l Mixed混合模式:子元素中既可有文本数据又可有下级子元素。
<!ELEMENT rn (#PCDATA| an | en)*>“|”和“*”必须写。
上句表示在 rn内,字符数据 或 en及an可以出现任意多次,顺序不限。
优先写(#PCDATA) 如:(#PCDATA|name)*正确  (name|#PCDATA)*错误
 ANY元素可以包含任何类型的数据。
子元素(必须在DTD中有定义)和 文本数据(包括空白)。
DTD中定义: <!ELEMENT a ANY> <!ELEMENT b ANY>
XML中合法内容: <a>somngthing</a>或者 <a/>或者 <a><b>oo</b></a>
属性(ATTLIST)
 特定元素类型可设置的属性&属性的允许值声明
<!ATTLIST elementName
attributeName1 attributeType attributeDefault
       .......
       attributeNameN attributeType attributeDefault>
 l 属性类型 (Attribute Type):
CDATA该属性只能包含字符数据(注意与CDATA段、PCDATA的区别)
NMTOKEN 是CDATA的子集,它的字符只能是字母,数字,句点,破折号,下划线或冒号。
NMTOKENS类似NMTOKEN,但这个可以包含多个值,每个值之间用空格隔开。
ID          该属性的取值在同一文档内是唯一的。一个元素只能有一个ID类型的属性。
IDREF      类似指针,指向文档中其他地方声明的ID值。如果该属性取值和指向的ID不匹配,则返回错误。
IDREFS     类似IDREF,但它可以具有由空格分隔开的多个引用。
ENTITY     该属性的值必须对应一个在文档内部声明的但还没有分析过的实体。
ENTITYS   类似ENTITY,但它可以包含由空格分隔开的多个实体。
NOTATION  该属性的值必须引用在文档中其他地方声明的某个注释的名称。
(enumerated) 类似枚举的变量,该属性必须匹配所列的值。各值用“|”分隔开如: (春|夏|秋|冬)实际内容文档只能从中取一个。
属性特性 (Attribute Default):
#REQUIRED    必须有且只能有一个属性。
#IMPLIED       可有可无。
#FIXED         在DTD中定义默认值,XML中可以不指定,指定则必须等于该默认值。
attribute-value      如果不指定则用DTD定义的默认值,指定则用指定的值。
属性(ATTLIST)的举例
例一(#REQUIRED)
DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at1 NMTOKENS #REQUIRED at2 CDATA #REQUIRED>
XML中,正确: <el at1 = "10 20"  at2="10" >something</el>
XML中,错误: <el at="10">something</el> (没有写另一个#REQUIRED的属性 at2 )
例二(#IMPLIED,#FIXED)
DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA #FIXED "10" at2 CDATA #IMPLIED >
XML中,正确: <el  at2="20" >something</el>(at有默认值"10",at2可写可不写)
XML中,错误: <el at="11" >something</el>(at要么不写,要写只能写成跟默认值相同的)
例三(attribute-value)
DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA "10" at2 CDATA "20" >
XML中,正确: <el at="11" >something</el>
例四(enumerated + attribute-value)
DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at (10|20|30) "10">
XML中,正确: <el at="20">something</el> (at要么不写,默认值 10;要么在(10|20|30)中选一个写)
实体(ENTITY)
可重用的内容声明
在DTD中定义 <!ENTITY实体标志 "实体内容">
在xml中引用自定义的实体,用 &实体标志; 代表实体内容。
 符号(NOTATION)
不要解析的外部内容的格式声明。
内部实体&&外部实体
内部实体:在xml文件里面写(少用)
外部实体:另外在xml同一文件夹下建立一个dtd文件(提倡)
 l 内外部的实体举例
 外部的:
     <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     <!DOCTYPE root SYSTEM "goodsInfo.dtd"><!--用这句引用外部dtd-->
     <root><goodsInfo>
         <goodsName>goodsName</goodsName>
         <goodsPrice>goodsPrice</goodsPrice>
     </goodsInfo></root>

     以下是名为"goodsInfo.dtd"文件
     <!ELEMENT root  (goodsInfo)>
     <!ELEMENT goodsInfo (goodsName,goodsPrice)>
     <!ELEMENT goodsName (#PCDATA)>
     <!ELEMENT goodsPrice (#PCDATA)>
 
 内部的:
     <?xml version="1.0"?>
     <!DOCTYPE root [
         <!ELEMENT root(student)>
         <!ELEMENT student (#PCDATA)>
         <!ENTITY CCTV "中央电视台">
     ]> <!--把DTD文件写在体内-->
     <root><student>
         student watch &CCTV;<!--使用自定义实体 CCTV-->
     </student></root>
 今天学到的很少 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tinyxml2是一个用于解析和操作XML文档的C++库。它提供了一组简单易用的API,可以方便地遍历XML文档的节点。 要遍历一个XML文档,首先需要创建一个XMLDocument对象,并通过其LoadFile()方法加载XML文件。然后,可以通过XMLDocument对象的FirstChild()方法获取XML文档的根节点XMLElement对象。 接下来,可以使用XMLElement对象的FirstChildElement()方法获取第一个子节点,并通过NextSiblingElement()方法遍历其余的兄弟节点。可以使用Value()方法获取节点的名称,使用GetText()方法获取节点的文本内容。 此外,还可以使用FirstChildElement()和NextSiblingElement()方法在节点的子节点进行遍历,以及使用Attribute()方法获取节点的属性值。 下面是一个示例代码,演示了如何使用tinyxml2库遍历一个XML文档: ```cpp #include "tinyxml2.h" #include <iostream> using namespace tinyxml2; int main() { XMLDocument doc; if (doc.LoadFile("example.xml") == XML_SUCCESS) { XMLElement* root = doc.FirstChildElement(); if (root) { for (XMLElement* child = root->FirstChildElement(); child; child = child->NextSiblingElement()) { std::cout << "Node name: " << child->Value() << std::endl; std::cout << "Node text: " << child->GetText() << std::endl; for (XMLElement* subChild = child->FirstChildElement(); subChild; subChild = subChild->NextSiblingElement()) { std::cout << "Subnode name: " << subChild->Value() << std::endl; std::cout << "Subnode text: " << subChild->GetText() << std::endl; } } } } return 0; } ``` 上述代码,假设存在一个名为"example.xml"的XML文件,代码加载该文件并遍历了其节点及其子节点,并输出了节点的名称和文本内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值