本文先做知识点的简单介绍,最后附完整案例。
一、解析XML文件
public class Foo {
//url为XML文档地址
//自己封装了一个工具类 返回解析完成的document
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
}
二、利用JAVA的iterator来导航文档(遍历文档)
public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();
// 从根节点开始遍历
for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
Element element = it.next();
// do something
}
// 从根节点的名为“foo”的子节点开始遍历
for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
Element foo = it.next();
// do something
}
// 遍历根节点的属性
for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
Attribute attribute = it.next();
// do something
}
}
三、在
public void bar(Document document) {
List
Node node = document.selectSingleNode("//foo/bar/author");
//获取node节点的name属性值
String name = node.valueOf("@name");
}
例如,如果您希望在XHTML文档中找到所有超文本链接,则可以使用以下代码。
public void findLinks(Document document) throws DocumentException {
List<Node> list = document.selectNodes("//a/@href");
for (Iterator<Node> iter = list.iterator(); iter.hasNext();) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
}
}
四、如果遍历大型XML文档树,那么为了提高性能,可以使用快速循环方法,这样可以避免为每个循环创建Iterator对象的成本
public void treeWalk(Document document) {
treeWalk(document.getRootElement());
}
public void treeWalk(Element element) {
for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
}
else {
// do something…
}
}
}
五、创建XML文档
public class Foo {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("root");
//创建root的子节点 并添加相关的属性值
Element author1 = root.addElement("author")
.addAttribute("name", "James")
.addAttribute("location", "UK")
.addText("James Strachan");
//创建root的子节点 并添加相关的属性值
Element author2 = root.addElement("author")
.addAttribute("name", "Bob")
.addAttribute("location", "US")
.addText("Bob McWhirter");
return document;
}
}
六、将创建好的文档保存至磁盘
public class Foo {
public void write(Document document) throws IOException {
// 保存至output.xml
try (FileWriter fileWiter = new FileWriter("output.xml")) {
XMLWriter writer = new XMLWriter(fileWriter);
writer.write( document );
writer.close();
}
// 以格式化的形式保存 有缩进...
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(System.out, format);
writer.write( document );
}
}
tips:
将字符串转化为XML文档
String text = "
Document document = DocumentHelper.parseText(text);
七、利用XSLT转换XML
<table border="1">
<tr>
<th>Name</th>
<th>Telephone</th>
<th>Email</th>
</tr>
<xsl:for-each select="PHONEBOOK/PERSON">
<xsl:sort />
<tr>
<td>
<xsl:value-of select="NAME" />
</td>
<td>
<xsl:value-of select="TELEPHONE" />
</td>
<td>
<xsl:value-of select="EMAIL" />
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
public class XSLTTest {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read("phonebook.xml");
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource("style1.xsl"));
DocumentSource source = new DocumentSource(document);
DocumentResult result = new DocumentResult();
transformer.transform(source, result);
Document doc = result.getDocument();
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(System.out, format);
writer.write(doc);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
转换结果
Name | Telephone | |
---|---|---|
Green | 202-414-9999 | green@yourserver.com |
Joe Wang | 202-999-9999 | joe@yourserver.com |
Karol | 306-999-9999 | karol@yourserver.com |
手机扫一扫
移动阅读更方便
你可能感兴趣的文章