XPath 使用路径表达式在 XML 文档中选取节点。节Ҏ(gu)通过沿着路径或?step 来选取的?/p>
表达?/th> | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节炚w择文档中的节点Q而不考虑它们的位|?/td> |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属?/td> |
在下面的表格中,我们已列Z(jin)一些\径表辑ּ以及(qing)表达式的l果Q?/p>
路径表达?/th> | l果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点 |
/bookstore |
选取根元?bookstore 注释Q假如\径v始于正斜? / )Q则此\径始l代表到某元素的l对路径Q?/p> |
bookstore/book | 选取所有属?bookstore 的子元素?book 元素?/td> |
//book | 选取所?book 子元素,而不它们在文档中的位置?/td> |
bookstore//book | 选择所有属?bookstore 元素的后代的 book 元素Q而不它们位?bookstore 之下的什么位|?/td> |
//@lang | 选取所有名?lang 的属性?/td> |
谓语用来查找某个特定的节Ҏ(gu)者包含某个指定的值的节点?/p>
谓语被嵌在方括号中?/p>
在下面的表格中,我们列出?jin)带有谓语的一些\径表辑ּQ以?qing)表辑ּ的结果?x)
路径表达?/th> | l果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的W一?book 元素?/td> |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一?book 元素?/td> |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数W二?book 元素?/td> |
/bookstore/book[position()<3] | 选取最前面的两个属?bookstore 元素的子元素?book 元素?/td> |
//title[@lang] | 选取所有拥有名?lang 的属性的 title 元素?/td> |
//title[@lang='eng'] | 选取所?title 元素Q且q些元素拥有gؓ(f) eng ?lang 属性?/td> |
/bookstore/book[price>35.00] | 选取所?bookstore 元素?book 元素Q且其中?price 元素的值须大于 35.00?/td> |
/bookstore/book[price>35.00]/title | 选取所?bookstore 元素中的 book 元素?title 元素Q且其中?price 元素的值须大于 35.00?/td> |
XPath 通配W可用来选取未知?XML 元素?/p>
通配W?/th> | 描述 |
---|---|
* | 匚wM元素节点 |
@* | 匚wM属性节?/td> |
node() | 匚wMcd的节?/td> |
在下面的表格中,我们列出?jin)一些\径表辑ּQ以?qing)这些表辑ּ的结果?x)
路径表达?/th> | l果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子节点 |
//* | 选取文档中的所有元?/td> |
//title[@*] | 选取所有带有属性的 title 元素?/td> |
通过在\径表辑ּ中?#8220;|”q算W,(zhn)可以选取若干个\径?/p>
在下面的表格中,我们列出?jin)一些\径表辑ּQ以?qing)这些表辑ּ的结果?x)
路径表达?/th> | l果 |
---|---|
//book/title | //book/price | 选取所?book 元素?title ?price 元素?/td> |
//title | //price | 选取所有文档中?title ?price 元素?/td> |
/bookstore/book/title | //price | 选取所有属?bookstore 元素?book 元素?title 元素Q以?qing)文档中所有的 price 元素?/td> |
轴可定义某个相对于当前节点的节点集?/p>
轴名U?/th> | l果 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等Q?/td> |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等Q以?qing)当前节?gu)w?/td> |
attribute | 选取当前节点的所有属?/td> |
child | 选取当前节点的所有子元素?/td> |
descendant | 选取当前节点的所有后代元素(子、孙{)(j)?/td> |
descendant-or-self | 选取当前节点的所有后代元素(子、孙{)(j)以及(qing)当前节点本n?/td> |
following | 选取文档中当前节点的l束标签之后的所有节炏V?/td> |
namespace | 选取当前节点的所有命名空间节?/td> |
parent | 选取当前节点的父节点?/td> |
preceding | 选取文档中当前节点的开始标{之前的所有节炏V?/td> |
preceding-sibling | 选取当前节点之前的所有同U节炏V?/td> |
self | 选取当前节点?/td> |
位置路径可以是绝对的Q也可以是相对的?/p>
l对路径起始于正斜杠( / )Q而相对\径不?x)这栗在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分Ԍ(x)
/step/step/...
step/step/...
每个步均Ҏ(gu)当前节点集之中的节点来进行计?/p>
轴名U?:节点试[谓语]
例子 | l果 |
---|---|
child::book | 选取所有属于当前节点的子元素的 book 节点 |
attribute::lang | 选取当前节点?lang 属?/td> |
child::* | 选取当前节点的所有子元素 |
attribute::* | 选取当前节点的所有属?/td> |
child::text() | 选取当前节点的所有文本子节点 |
child::node() | 选取当前节点的所有子节点 |
descendant::book | 选取当前节点的所?book 后代 |
ancestor::book | 选择当前节点的所?book 先辈 |
ancestor-or-self::book | 选取当前节点的所有book先辈以及(qing)当前节点Q假如此节点是book节点的话Q?/td> |
child::*/child::price | 选取当前节点的所?price 孙?/td> |
下面列出?jin)可用?XPath 表达式中的运符Q?/p>
q算W?/th> | 描述 | 实例 | q回?/th> |
---|---|---|---|
| | 计算两个节点?/td> | //book | //cd | q回所有带?book ?ck 元素的节炚w |
+ | 加法 | 6 + 4 | 10 |
- | 减法 | 6 - 4 | 2 |
* | 乘法 | 6 * 4 | 24 |
div | 除法 | 8 div 4 | 2 |
= | {于 | price=9.80 |
如果 price ?9.80Q则q回 true?/p> 如果 price ?9.90Q则q回 fasle?/p> |
!= | 不等?/td> | price!=9.80 |
如果 price ?9.90Q则q回 true?/p> 如果 price ?9.80Q则q回 fasle?/p> |
< | 于 | price<9.80 |
如果 price ?9.00Q则q回 true?/p> 如果 price ?9.90Q则q回 fasle?/p> |
<= | 于或等?/td> | price<=9.80 |
如果 price ?9.00Q则q回 true?/p> 如果 price ?9.90Q则q回 fasle?/p> |
> | 大于 | price>9.80 |
如果 price ?9.90Q则q回 true?/p> 如果 price ?9.80Q则q回 fasle?/p> |
>= | 大于或等?/td> | price>=9.80 |
如果 price ?9.90Q则q回 true?/p> 如果 price ?9.70Q则q回 fasle?/p> |
or | ?/td> | price=9.80 or price=9.70 |
如果 price ?9.80Q则q回 true?/p> 如果 price ?9.50Q则q回 fasle?/p> |
and | ?/td> | price>9.00 and price<9.90 |
如果 price ?9.80Q则q回 true?/p> 如果 price ?8.50Q则q回 fasle?/p> |
mod | 计算除法的余?/td> | 5 mod 2 | 1 |
Simple 名副其实Q它使用注解来支持序列化和反序列化过E。根据相应的 XML 文档应该如何出现Q对 POJO q行注解。一些字D被注解为属性,另一些字D被注解为元素。类通常被注解ؓ(f)根元素。在序列化过E中Q该框架处理冗长的解释注解和产生相应 XML 文档的过E。无ؓ(f)奇,?XML 文档被{换成 POJO 的反序列化过E中Q注解也?x)被解释?/p>
使用 Simple 有几个优ѝ首先,它促(j)q快速应用程序开发。Simple 是如此简单,它支持开发h员快速实现健壮的、?XML 序列化和反序列化的应用程序,无需完成镉K的学?fn)曲U以?qing)付出繁重的开发劳动?/p>
其次QSimple 不需要配|。前面已l提刎ͼSimple 使用注解。这些注解取代了(jin)Z XML 的配|文Ӟ其他框架一般都有这L(fng)配置文gQ?/p>
最后,Simple 只让使用它的应用E序增加量的内存占用。JAR文g只有 239 KB。Simple 也不依赖于一pd其他 JAR 文gQ而其他框架则通常不是q样的?br /> jar下蝲地址Q?font style="background-color: #cce8cf">http://simple.sourceforge.net/track/get.php?version=2.2&package=simple-xml-2.2.zip
单实例:(x)bean--》xml
beanQ?br />
@Root public class Example { @Element private String text; @Attribute private int index; public Example() { super(); } public Example(String text, int index) { this.text = text; this.index = index; } public String getMessage() { return text; } public int getId() { return index; } }试代码Q?br />
Serializer serializer = new Persister(); Example example = new Example("Example message", 123); File result = new File("example.xml"); serializer.write(example, result);生成xml文gQ?br />
<example index="123"> <text>Example message</text> </example>
?DTD 中,XML 元素通过元素声明来进行声明。元素声明用下面的语法Q?/p>
<!ELEMENT 元素名称 cd>
或?/p>
<!ELEMENT 元素名称 (元素内容)>
I元素通过cd关键词EMPTYq行声明Q?/p>
<!ELEMENT 元素名称 EMPTY>
<!ELEMENT br EMPTY>
<br />
只有 PCDATA 的元素通过圆括号中?#PCDATA q行声明Q?/p>
<!ELEMENT 元素名称 (#PCDATA)>
<!ELEMENT from (#PCDATA)>
通过cd关键?ANY 声明的元素,可包含Q何可解析数据的组合:(x)
<!ELEMENT 元素名称 ANY>
<!ELEMENT note ANY>
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:(x)
<!ELEMENT 元素名称 (子元素名U?1)>
或?/p>
<!ELEMENT 元素名称 (子元素名U?1,子元素名U?2,.....)>
<!ELEMENT note (to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时Q这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素?note" 元素的完整声明是Q?/p>
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
<!ELEMENT 元素名称 (子元素名U?>
<!ELEMENT note (message)>
上面的例子声明了(jin)Qmessage 子元素必dCơ,q且必须只在 "note" 元素中出Cơ?/p>
<!ELEMENT 元素名称 (子元素名U?)>
<!ELEMENT note (message+)>
上面的例子中的加号声明了(jin)Qmessage 子元素必d "note" 元素内出现至一ơ?/p>
<!ELEMENT 元素名称 (子元素名U?)>
<!ELEMENT note (message*)>
上面的例子中的星号声明了(jin)Q子元素 message 可在 "note" 元素内出现零ơ或多次?/p>
<!ELEMENT 元素名称 (子元素名U?)>
<!ELEMENT note (message?)>
上面的例子中的问号声明了(jin)Q子元素 message 可在 "note" 元素内出现零ơ或一ơ?/p>
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了(jin)Q?note" 元素必须包含 "to" 元素?from" 元素?header" 元素Q以?qing)?"message" 元素?"body" 元素?/p>
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了(jin)Q?note" 元素可包含出现零ơ或多次?PCDATA?to"?from"?header" 或?"message"?br />
?DTD 中,属性通过 ATTLIST 声明来进行声明?/strong>
属性声明拥使用下列语法Q?/p>
<!ATTLIST 元素名称 属性名U?属性类?默认?gt;
<!ATTLIST payment type CDATA "check">
<payment type="check" />
cd | 描述 |
---|---|
CDATA | gؓ(f)字符数据 (character data) |
(en1|en2|..) | 此值是枚D列表中的一个?/td> |
ID | gؓ(f)唯一?id |
IDREF | gؓ(f)另外一个元素的 id |
IDREFS | gؓ(f)其他 id 的列?/td> |
NMTOKEN | gؓ(f)合法?XML 名称 |
NMTOKENS | gؓ(f)合法?XML 名称的列?/td> |
ENTITY | 值是一个实?/td> |
ENTITIES | 值是一个实体列?/td> |
NOTATION | 此值是W号的名U?/td> |
xml: | 值是一个预定义?XML ?/td> |
?/th> | 解释 |
---|---|
?/td> | 属性的默认?/td> |
#REQUIRED | 属性值是必需?/td> |
#IMPLIED | 属性不是必需?/td> |
#FIXED value | 属性值是固定?/td> |
<!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0">
<square width="100" />
在上面的例子中,"square" 被定义ؓ(f)带有 CDATA cd?"width" 属性的I元素。如果宽度没有被讑֮Q其默认gؓ(f)0 ?/p>
<!ATTLIST 元素名称 属性名U?属性类?#IMPLIED>
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
合法?XML:
<contact fax="555-667788" />
合法?XML:
<contact />
假如(zhn)不希望强制作者包含属性,q且(zhn)没有默认值选项的话Q请使用关键?#IMPLIED?/p>
<!ATTLIST 元素名称 属性名U?属性类?#REQUIRED>
DTD:
<!ATTLIST person number CDATA #REQUIRED>
合法?XML:
<person number="5677" />
非法?XML:
<person />
假如(zhn)没有默认值选项Q但是仍然希望强制作者提交属性的话,请用关键词 #REQUIRED?/p>
<!ATTLIST 元素名称 属性名U?属性类?#FIXED "value">
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法?XML:
<sender company="Microsoft" />
非法?XML:
<sender company="W3School" />
如果(zhn)希望属性拥有固定的|q不允许作者改变这个|请?#FIXED 关键词。如果作者用了(jin)不同的|XML 解析器会(x)q回错误?/p>
<!ATTLIST 元素名称 属性名U?(en1|en2|..) 默认?gt;
<!ATTLIST payment type (check|cash) "cash">
<payment type="check" />
或?/p>
<payment type="cash" />
如果(zhn)希望属性gؓ(f)一pd固定的合法g一Q请使用列D属性倹{?/p>
实体是用于定义用于定义引用普通文本或Ҏ(gu)字符的快h式的变量?/strong>
实体引用是对实体的引用?/strong>
实体可在内部或外部进行声明?/strong>
<!ENTITY 实体名称 "实体的?>
DTD 例子:
<!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn">
XML 例子:
<author>&writer;©right;</author>
注释: 一个实体由三部分构? 一个和?(&), 一个实体名U? 以及(qing)一个分?(;)?/p>
<!ENTITY 实体名称 SYSTEM "URI/URL">
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子:
<author>&writer;©right;</author>