xml
1Schema学习笔记 1 2xpath语法 4 3操作xml必须注意点【常犯的错误】 11 1Schema学习笔记schema:用xml约束另外一个xml 模式文档实例文档 xmlns声明命名空间引擎自动识别一个命名空间指出对应命名空间schema的位置 schema用于xml验证 xml简易元素 声明属性 xsd限定技术/facets:更具体的限定 具体看w3c文档 实例:可以通过eclipse生成默认的xml文件 <?xmlversion="1.0"?> <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn"xmlns="http://www.w3school.com.cn" elementFormDefault="qualified"> <xs:elementname="root"> <xs:complexType> <xs:sequence> <xs:elementname="global"> <xs:complexType> <xs:sequence> <xs:elementname="log4jFile"type="xs:string"default="log4j.xml"></xs:element> <xs:elementname="fileSuffix"type="xs:string" default=".ibe"></xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:elementname="pkgServer"minOccurs="1"> <xs:complexType> <xs:sequence> <xs:elementname="pkgIp"type="xs:string"default="127.0.0.1"></xs:element> <xs:elementname="pkgPort"type="xs:int"default="8000"></xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:elementname="keyServer"minOccurs="1"> <xs:complexType> <xs:sequence> <xs:elementname="keyIp"type="xs:string"default="127.0.0.1"></xs:element> <xs:elementname="keyPort"type="xs:int"default="8001"></xs:element> <xs:elementname="keyXml"type="xs:string"default="keyAuthRequired.xml"></xs:element> <xs:elementname="interval"type="xs:int"default="86400000"></xs:element> <xs:elementname="randomValidTime"type="xs:int"default="7200000"></xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:elementname="identityServer"minOccurs="1"> <xs:complexType> <xs:sequence> <xs:elementname="identityIp"type="xs:string"default="127.0.0.1"></xs:element> <xs:elementname="identityPort"type="xs:int"default="8002"></xs:element> <xs:elementname="identityXml"type="xs:string" default="identityAuthRequired.xml"></xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:elementname="database"> <xs:complexType> <xs:sequence> <xs:elementname="dbDriver"type="xs:string" default="com.mysql.jdbc.Driver"></xs:element> <xs:elementname="dbUrl"type="xs:string" default="jdbc:mysql://localhost:3306/ibe"></xs:element> <xs:elementname="dbUser"type="xs:string"default="root"></xs:element> <xs:elementname="dbPassword"type="xs:string" default="080302"></xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:elementname="security"> <xs:complexType> <xs:sequence> <xs:elementname="keyStorePath"type="xs:string" default="keystore/pkg.jks"></xs:element> <xs:elementname="keyStorePassword"type="xs:string" default="080302"></xs:element> <xs:elementname="trustStorePath"type="xs:string" default="keystore/pkg.jks"></xs:element> <xs:elementname="rootAlias"type="xs:string"default="root"></xs:element> <xs:elementname="userAlias"type="xs:string"default="pkgclient"></xs:element> <xs:elementname="privateKeyPassword"type="xs:string" default="080302"></xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 2xpath语法需要使用的jar包:dom4j和jaxen(是dom4j的一个基础包) 解析含有命名空间的xml方法1 Mapmap=newHashMap(); map.put("sys","http://www.w3school.com.cn"); SAXReadersaxReader=newSAXReader(); Filefile=newFile("src/system.xml"); Documentdocument=saxReader.read(file); XPathx=document.createXPath("//sys:pkgIp"); x.setNamespaceURIs(map); Listnodelist=x.selectNodes(document); System.out.println(nodelist.size()); 解析含有命名空间的xml方法2 Mapmap=newHashMap(); map.put("sys","http://www.w3school.com.cn"); SAXReadersaxReader=newSAXReader(); Filefile=newFile("src/system.xml"); saxReader.getDocumentFactory().setXPathNamespaceURIs(map); Documentdocument=saxReader.read(file); Listtmp=document.selectNodes("//sys:pkgIp"); System.out.println(tmp.size()); (1)获取Document SAXReadersaxReader=newSAXReader(); Documentdocument=saxReader.read(FileUtil.getFileInputStream(fileName)); (2)查询Element Stringxpath="/composites/composite[@type='onDelete']";//查询属性type='ondDelete'的composite List<Element>composites=document.selectNodes(xpath); (3)xpath语法 选取节点 XPath使用路径表达式在XML文档中选取节点。节点是通过沿着路径或者step来选取的。 下面列出了最有用的路径表达式: 表达式描述
实例 在下面的表格中,我们已列出了一些路径表达式以及表达式的结果: 路径表达式结果
谓语(Predicates) 谓语用来查找某个特定的节点或者包含某个指定的值的节点。 谓语被嵌在方括号中。 在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果: /bookstore/book[1] |
选取属于bookstore子元素的第一个book元素。 | ||||||||||||||||||||||||
/bookstore/book[last()] | 选取属于bookstore子元素的最后一个book元素。 | ||||||||||||||||||||||||
/bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素。 | ||||||||||||||||||||||||
/bookstore/book[position()<3] | 选取最前面的两个属于bookstore元素的子元素的book元素。 | ||||||||||||||||||||||||
//title[@lang] | 选取所有拥有名为lang的属性的title元素。 | ||||||||||||||||||||||||
//title[@lang='eng'] | 选取所有title元素,且这些元素拥有值为eng的lang属性。 | ||||||||||||||||||||||||
/bookstore/book[price>35.00] | 选取所有bookstore元素的book元素,且其中的price元素的值须大于35.00。 | ||||||||||||||||||||||||
/bookstore/book[price>35.00]/title | 选取所有bookstore元素中的book元素的title元素,且其中的price元素的值须大于35.00。 |
选取未知节点
XPath通配符可用来选取未知的XML元素。
通配符描述
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
/bookstore/*
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
//book/title|//book/price
XPath轴
轴可定义某个相对于当前节点的节点集。
轴名称结果
ancestor | 选取当前节点的所有先辈(父、祖父等) |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
attribute | 选取当前节点的所有属性 |
child | 选取当前节点的所有子元素。 |
descendant | 选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following | 选取文档中当前节点的结束标签之后的所有节点。 |
namespace | 选取当前节点的所有命名空间节点 |
parent | 选取当前节点的父节点。 |
preceding | 选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling | 选取当前节点之前的所有同级节点。 |
self | 选取当前节点。 |
位置路径表达式
位置路径可以是绝对的,也可以是相对的。
绝对路径起始于正斜杠(/),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:
绝对位置路径:
/step/step/...
相对位置路径:
step/step/...
每个步均根据当前节点集之中的节点来进行计算。
步(step)包括:
轴(axis)
定义所选节点与当前节点之间的树关系
节点测试(node-test)
识别某个轴内部的节点
零个或者更多谓语(predicate)
更深入地提炼所选的节点集
步的语法:
轴名称::节点测试[谓语]
例子结果
child::book | 选取所有属于当前节点的子元素的book节点 | |
attribute::lang | 选取当前节点的lang属性 | |
child::* | 选取当前节点的所有子元素 | |
attribute::* | child::text() | 选取当前节点的所有文本子节点 |
child::node() | 选取当前节点的所有子节点 | |
descendant::book | 选取当前节点的所有book后代 | |
ancestor::book | 选择当前节点的所有book先辈 | |
ancestor-or-self::book | 选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话) | |
child::*/child::price | 选取当前节点的所有price孙。 |
XPath运算符
下面列出了可用在XPath表达式中的运算符:
运算符描述实例返回值
| | 计算两个节点集 | //book|//cd | 返回所有带有book和ck元素的节点集 | |||||||||
+ | 加法 | 6+4 | 10 | |||||||||
- | 减法 | 6-4 | 2 | |||||||||
乘法 | 6*4 | 24 | ||||||||||
div | 除法 | 8div4 | = | 等于 | price=9.80 | 如果price是9.80,则返回true。 如果price是9.90,则返回fasle。 |
||||||
!= | 不等于 | price!=9.80 | 如果price是9.90,则返回true。 如果price是9.80,则返回fasle。 |
|||||||||
< | 小于 | price<9.80 | 如果price是9.00,则返回true。 <= |
小于或等于 | price<=9.80 | > | 大于 | price>9.80 | >= | 大于或等于 | price>=9.80 | 如果price是9.70,则返回fasle。 |
or | 或 | price=9.80orprice=9.70 | 如果price是9.50,则返回fasle。 | |||||||||
and | 与 | price>9.00andprice<9.90 | 如果price是8.50,则返回fasle。 | |||||||||
mod | 计算除法的余数 | 5mod2 |
3操作xml必须注意点【常犯的错误】
修改操作执行最后必须有输出操作。
下面是输入输出代码
packageutil.xmlConfig;
importjava.io.FileOutputStream;
importorg.dom4j.DocumentException;
importorg.dom4j.io.OutputFormat;
importorg.dom4j.io.SAXReader;
importorg.dom4j.io.XMLWriter;
importorg.dom4j.Document;
publicclassXmlIO{
privateStringxmlFileName="default.xml";//默认配置文件名称
publicvoidsetXmlFileName(StringxmlFileName){
this.xmlFileName=xmlFileName;
}
publicXmlIO(StringxmlFileName){
this.xmlFileName=xmlFileName;
}
publicDocumentreadXML(){
SAXReaderreader=newSAXReader();
Documentdocument=null;
try{
document=reader.read(xmlFileName);
}catch(DocumentExceptione){
System.err.println(e.getMessage());
}
returndocument;
}
publicvoidwriteXML(Documentdocument){
OutputFormatformat=OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriterwriter=null;
try{
writer=newXMLWriter(newFileOutputStream(xmlFileName),format);
writer.write(document);
writer.close();
}catch(Exceptione){
System.err.println(e.getMessage());
}
}
}
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!