解析XML

https://dom4j.github.io/

dom4j完整教程

您可能要做的第一件事就是解析某种 XML 文档。这在< dom 4 j >中很容易做到。以下代码演示了如何执行此操作。

import java.net.URL;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class Foo {

    public Document parse(URL url) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(url);
        return document;
    }
}

使用迭代器

可以使用返回标准 Java 迭代器的各种方法来导航文档。例如

public void bar(Document document) throws DocumentException {

    Element root = document.getRootElement();

    // iterate through child elements of root
    for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
        Element element = it.next();
        // do something
    }

    // iterate through child elements of root with element name "foo"
    for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
        Element foo = it.next();
        // do something
    }

    // iterate through attributes of root
    for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
        Attribute attribute = it.next();
        // do something
    }
 }

使用 XPath 进行强大的导航

在< dom 4 j >中,XPath 表达式可以在DocumentNode树中的任何一个上进行计算(例如AttributeElement或 ProcessingInstruction)。这允许使用一行代码在整个文档中进行复杂的导航。例如

public void bar(Document document) {
    List<Node> list = document.selectNodes("//foo/bar");

    Node node = document.selectSingleNode("//foo/bar/author");

    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();
    }
}

如果您在学习XPath语言时需要任何帮助,我们强烈推荐Zvon 教程,您可以通过示例进行学习。

快速循环

如果您必须遍历大型XMLIterator文档树,那么为了提高性能,我们建议您使用快速循环方法,这样可以避免为每个循环创建对象的成本。例如

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 文档

通常在< dom 4 j >中,您需要从头开始创建一个新文档。这是这样做的一个例子。

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class Foo {

    public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("root");

        Element author1 = root.addElement("author")
            .addAttribute("name", "James")
            .addAttribute("location", "UK")
            .addText("James Strachan");

        Element author2 = root.addElement("author")
            .addAttribute("name", "Bob")
            .addAttribute("location", "US")
            .addText("Bob McWhirter");

        return document;
    }
}

将文档写入文件

Document将 a (或任何Node)写入 a 的一种快速而简单的方法Writer是通过write()方法。

FileWriter out = new FileWriter("foo.xml");
document.write(out);
out.close();

如果您希望能够更改输出的格式,例如漂亮的打印或紧凑格式,或者您希望能够使用Writer 对象或OutputStream对象作为目标,那么您可以使用该类XMLWriter

import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Foo {

    public void write(Document document) throws IOException {

        // lets write to a file
        try (FileWriter fileWriter = new FileWriter("output.xml")) {
            XMLWriter writer = new XMLWriter(fileWriter);
            writer.write( document );
            writer.close();
        }


        // Pretty print the document to System.out
        OutputFormat format = OutputFormat.createPrettyPrint();
        writer = new XMLWriter(System.out, format);
        writer.write( document );

        // Compact format to System.out
        format = OutputFormat.createCompactFormat();
        writer = new XMLWriter(System.out, format);
        writer.write(document);
        writer.close();
    }
}

与字符串之间的转换

Document如果您有对 a或任何其他Node(例如Attributeor )的引用Element,则可以通过该asXML()方法将其转换为默认 XML 文本。

Document document = …;
String text = document.asXML();

如果您有一些 XML 作为 a,您可以使用帮助器方法String将其重新解析回 aDocumentDocumentHelper.parseText()

String text = "<person> <name>James</name> </person>";
Document document = DocumentHelper.parseText(text);

Document使用 XSLT 转换

使用Oracle 的JAXP API在 a 上应用XSLTDocument非常简单。这允许您使用任何 XSLT 引擎,例如XalanSaxon。以下是使用 JAXP 创建转换器,然后将其应用到. Document

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;

public class Foo {

    public Document styleDocument(Document document, String stylesheet) throws Exception {

        // load the transformer using JAXP
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new StreamSource(stylesheet));

        // now lets style the given document
        DocumentSource source = new DocumentSource(document);
        DocumentResult result = new DocumentResult();
        transformer.transform(source, result);

        // return the transformed document
        Document transformedDoc = result.getDocument();
        return transformedDoc;
    }
}

Maven 工件签名

Maven 存储库中的所有工件均使用以下 PGP 密钥进行签名:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: Thumbprint:	8F9A3C6D105B9F57844A721D79E193516BE7998F

mQENBFWdcSoBCADK8j+0eVZKUGctZo/VaJ/K2Wppx4jEFgih8xiIWREQ9B3QEugJ
mJMWZHhrnHB+sjVx5No482ch6sVhYmC+VMyTdzepItZ8beYa0pnNGJnrFT+HcTOS
g21Ef5e6BRORNho2j9YTvxvjof29XxU4SJFVgffs48jGeJzN1EDmOz4OlZupKGU+
98o+kMKCiFjcf6Vu03asuml97b2fMOJ09n+UQVlZbBR/Yo407ZLkL2Elx47Fz+82
iO+M8w2qNnxT4PA/TLgaVzkVHaR/JIDlQQ4DfuyloQI1hBpMB8f60oukVr5dBGuS
1dPZ1H7td975sLegWoj7CCOFZXrDzYUXwwXPABEBAAG0IEZpbGlwIEppcnPDoWsg
PGZpbGlwQGppcnNhay5vcmc+iQE5BBMBCAAjBQJVnXEqAhsDBwsJCAcDAgEGFQgC
CQoLBBYCAwECHgECF4AACgkQeeGTUWvnmY/Z6wgArX9fzySIVWcqFuhaIlRlib9j
1qE3sSiFVENV4NrCYv+4ZUQUEUvqwX0F4ij+Au9fzvaWb0gT02ErHYJ9UowUgUYb
IdHsifoGh05jZdiClXJutcQHddM+P+ReIAS4/JDlXza1kqa1RRvDh+OtsrDkL1MU
a5T6/KbCWzAj9+96vqa2dLO0mhyrPpVX/hF4tPY6ltGYEXA9N3c83rFmaCZTNM0t
sEQniQMICOMZul2dKJ4Tev12/G9sd4owtlHtAtv0+tFPDMPQAXjToUo36q9MIzKE
Cyz5sX64QRablAJc7QD4MFI/7J6eQdpSKM77QaL48kcUAK1j9nlXv+oj/1d437kB
DQRVnXEqAQgAonYI6XgMnKL5jj1n/3kVxKA+4m0znSoMutK3B2D3geqTzFWlDIWU
EOEE00U2mBMPUibQ9orbu5IYrbXLR6t0QORJiHudP3LxdtjIqXCagdzCewJ0Kfvd
pR/a65dsULLu4+v8R7KBH+lBVs0aN0z8e539ZaoGPCVaWliybbHwcry4tOMu9wyB
dPlt0pkqQ7y+YerXgHO+hc9urQVY9zHVBRe1J2vqzFONitFlD5BoT386pz8tBi0W
32J46nTgReukzJWLbtV53fxYAFUroA7Ydy2xYKQ2yVqBq9NraUNqbdtlEhJRDS3W
eQs4ittg+oyMumIdNjSbUlbDX0O7EP16KQARAQABiQEfBBgBCAAJBQJVnXEqAhsM
AAoJEHnhk1Fr55mPAAUH/itFMvGq/ri1alRXhLbhx8/HmwBBkgS8wCu/oIIPEZ4W
jRB8EfEYAMbmqtmbGFc/lL2QSxvqAcsUGFlVqRe+Ux9LilQx/84zvD6aG90eTzfF
pNUHkgBOS7poRbDggVaCSuDYKiyTc07hHNl4iZON3VSiOaXf/4rzbIzv0n0swc0s
00N1IcwI/pP+74t+tmfH4PUjZwUC6cXHMHSfvImAO2hPMAbd3rJ/ZO/ZVwjNocjR
5fQj/MSOgl5hiXEkuBdoqoD0lTJMYCwPgwPGNcBr2xeXOKxeIlbYGwh/j3AsK0Op
uqUJfZ5wvADbdmco+6Piann1q0WvhfmRaie7IPG2tB0=
=ZbfA
-----END PGP PUBLIC KEY BLOCK-----

Categories:

No responses yet

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

地点GIS

     地点GIS android版本是一款方便我们日常打开含地理信息的dxf 、kmz、 kml、shp矢量数据文件,并可以进行修改,文件相互转换的一个工具,有十种底图选择,强大的图形编辑功能,野外数据采集、导入导出。协同工作,可以满足日常工作需求。

  • 支持在线十种底图显示。
  • 绘制矢量图形功能(点、多点、线、面,矩形、圆、手绘线)
  • 支持打开通过微信发送过来压缩后的kml、dxf、shp文件,或者将矢量 文件压缩后发送。
  • 支持对打开文件矢量图形进行编辑,shp 文件的数据库字段和字段值,目前只支持浏览数据,不支持编辑(后续增加),但不影响增、删除图形数据。
  • 支持对图形的几何操作(分割、合并、交集,剪切、创建缓冲区等)。
  • 支持对矢量数据进行增加,删除,修改,查询。
  • 线段长度,图形面积,图形坐标显示
  • 支持图形多点、线、面互转。
  • 支持在线多人协同绘图,同步操作功能。
  • 图层的管理
  • 支持野外数据采集、手持 GPS 野外采集数据导入、支持距离、面积查询,全局查询、格式转换,对图形文件保存并发送其他好友等,更多功能你自己发现吧。