爪哇国新游记之三十四----Dom4j的XPath操作

本文涉及的产品
图片翻译,图片翻译 100张
文档翻译,文档翻译 1千页
语种识别,语种识别 100万字符
简介:

Dom4j是Java访问XML的利器之一,另一个是JDom。记得当年因为粗掌握点JDomAPI但项目要求使用Dom4j还闹一阵情绪,现在看来真是没必要,只花一些时间成本就进去一个新世界绝对是值得做的一件事。更何况JDom因无人更新而停顿了。

Dom4j有两个包,一个是dom4j-1.6.1.jar,它提供基本的XML API支持,如访问节点,属性等。

还有一个是jaxen-1.1-beta-9.jar,它提供XPath支持。

关于XPath的语法,请见转载:XPath基本语法

言归正传,下面请看例程。

1.访问节点群

XML样本:

复制代码
<applications>
    <application name='chat'>
        <mtLanguage source='ar_ar' target='en_us' />
        <mtLanguage source='zh_cn' target='en_us' />
        <mtLanguage source='zh_tw' target='en_us' />
        <mtLanguage source='en_us' target='ar_ar' />
        <mtLanguage source='en_us' target='zh_cn' />
        <mtLanguage source='en_us' target='zh_tw' />
        <mtLanguage source='en_us' target='fr_fr' />
        <mtLanguage source='en_us' target='de_de' />
        <mtLanguage source='en_us' target='it_it' />
        <mtLanguage source='en_us' target='ja_jp' />
        <mtLanguage source='en_us' target='ko_kr' />
        <mtLanguage source='en_us' target='pt_br' />
        <mtLanguage source='en_us' target='ru_ru' />
        <mtLanguage source='en_us' target='es_es' />
        <mtLanguage source='fr_fr' target='en_us' />
        <mtLanguage source='de_de' target='en_us' />
        <mtLanguage source='it_it' target='en_us' />
        <mtLanguage source='ja_jp' target='en_us' />
        <mtLanguage source='ko_kr' target='en_us' />
        <mtLanguage source='pt_br' target='en_us' />
        <mtLanguage source='ru_ru' target='en_us' />
        <mtLanguage source='es_es' target='en_us' />
    </application>
    <application name='doc'>
        <mtLanguage source='ar_ar' target='en_us' />
        <mtLanguage source='zh_cn' target='en_us' />
        <mtLanguage source='zh_tw' target='en_us' />
        <mtLanguage source='en_us' target='ar_ar' />
        <mtLanguage source='en_us' target='zh_cn' />
        <mtLanguage source='en_us' target='zh_tw' />
        <mtLanguage source='en_us' target='fr_fr' />
        <mtLanguage source='en_us' target='de_de' />
        <mtLanguage source='en_us' target='hi_in' />
        <mtLanguage source='en_us' target='it_it' />
        <mtLanguage source='en_us' target='ja_jp' />
        <mtLanguage source='en_us' target='ko_kr' />
        <mtLanguage source='en_us' target='pt_br' />
        <mtLanguage source='en_us' target='ru_ru' />
        <mtLanguage source='en_us' target='es_es' />
        <mtLanguage source='en_us' target='ur_pk' />
        <mtLanguage source='fr_fr' target='en_us' />
        <mtLanguage source='de_de' target='en_us' />
        <mtLanguage source='hi_in' target='en_us' />
        <mtLanguage source='it_it' target='en_us' />
        <mtLanguage source='ja_jp' target='en_us' />
        <mtLanguage source='ko_kr' target='en_us' />
        <mtLanguage source='pt_br' target='en_us' />
        <mtLanguage source='ru_ru' target='en_us' />
        <mtLanguage source='es_es' target='en_us' />
        <mtLanguage source='ur_pk' target='en_us' />
    </application>
</applications>
复制代码

现在,如果我想要访问属性为chat的application节点下的所有mtLanguage子节点,XPath应该这样写:

//applications/application[@name='chat']/mtLanguage

而具体操作的Java语句是:

复制代码
Document doc= DocumentHelper.parseText(responseXML);// 这个responseXML就是上面的XML样例
List<?> elms=doc.selectNodes("//applications/application[@name='chat']/mtLanguage");
System.out.println("There are "+elms.size()+" language pairs available in text translation");
                
for(Object obj:elms){
     Element elm=(Element)obj;                    
     System.out.println("From "+elm.attributeValue("source")+" to "+elm.attributeValue("target"));
}
复制代码

执行上面语句输出如下:

复制代码
There are 22 language pairs available in text translation
From ar_ar to en_us
From zh_cn to en_us
From zh_tw to en_us
From en_us to ar_ar
From en_us to zh_cn
From en_us to zh_tw
From en_us to fr_fr
From en_us to de_de
From en_us to it_it
From en_us to ja_jp
From en_us to ko_kr
From en_us to pt_br
From en_us to ru_ru
From en_us to es_es
From fr_fr to en_us
From de_de to en_us
From it_it to en_us
From ja_jp to en_us
From ko_kr to en_us
From pt_br to en_us
From ru_ru to en_us
From es_es to en_us
复制代码

 

2.访问特定节点

XML样本:

复制代码
<rep sts="OK" a="trep" tl="zh-CN">
    <docs>
        <d dt="ndoc" did="d20160223213120480009045125076363146" lang="en-US"
            ctime="2016-02-23T21:31:20" mtime="2016-02-23T21:31:20" orig="1"
            mime="text/x-mt-xml" wc="2">
            <p pid="1" wc="2">
                <s sid="1">
                    <t tid="1" tt="orig" wc="2">Good evening</t>
                </s>
            </p>
        </d>
        <d dt="ndoc" did="d20160223213120480009045125076363146" lang="zh-CN"
            ctime="2016-02-23T21:31:20" mtime="2016-02-23T21:31:20" orig="0"
            mime="text/x-mt-xml" sc="100.00" wc="1">
            <p pid="1" wc="1">
                <s sid="1">
                    <t tid="1" tt="mt" src="mt" sc="100.00" wc="1">晚上好</t>
                </s>
            </p>
        </d>
    </docs>
</rep>
复制代码

如果我想得到上文中“晚上好”这段文字,XPath应该这样写

//rep/docs/d[last()]/p/s/t

对应的Java代码是:

Document doc= DocumentHelper.parseText(responseXML);
Element elm = (Element) doc.selectSingleNode("//rep/docs/d[last()]/p/s/t");
targetTxt=elm.getText();

 

3.取属性

XML样本:

<rep sts="OK" a="trep" tl="zh-CN">
    <docs>1</docs>
</rep>

要取根节点rep的sts属性,XPath可以这样写:

//rep/@sts

而对应的Java语句是:

System.out.println("XML="+responseXML);
Document doc= DocumentHelper.parseText(responseXML);
Attribute attr = (Attribute) doc.selectSingleNode("//rep/@sts");      
            
return attr.getText();









本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/xiandedanteng/p/5212053.html,如需转载请自行联系原作者



相关文章
|
Java
Java 抽象类详解
在 Java 中,抽象类是一种特殊类,用于提供基础定义并派生具体子类,支持代码复用。它包含抽象方法(无实现)和具体方法(有实现),不能被实例化,需用 `abstract` 关键字定义。子类必须实现所有抽象方法,除非子类也是抽象类。抽象类可用于定义模板或框架,确保子类实现特定方法。通过示例展示了如何定义抽象类 `Animal` 及其子类 `Dog` 和 `Cat`,并在主类中调用相关方法。使用抽象类可以提高代码复用性和设计质量,但也可能增加维护难度和性能开销。
456 8
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在自定义RichSinkFunction中,如何获取source的schema
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
XML 缓存 JavaScript
优化Java中的XML解析性能
优化Java中的XML解析性能
|
SQL 资源调度 数据处理
实时计算 Flink版产品使用问题之-s参数在yarn-session.sh命令中是否有效
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
消息中间件 关系型数据库 网络安全
实时计算 Flink版操作报错合集之Flink sql-client 针对kafka的protobuf格式数据建表,报错:java.lang.ClassNotFoundException 如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
423 1
|
资源调度 分布式计算 Oracle
实时计算 Flink版操作报错合集之flink on yarn job manager 可以启动, 但不给分配slot ,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
455 0
|
SQL 存储 关系型数据库
Apache Flink 和 Paimon 在自如数据集成场景中的使用
自如目前线上有基于 Hive 的离线数仓和基于 Flink、Kafka 的实时数仓,随着业务发展,我们也在探索引入湖仓一体的架构更好的支持业务,我们对比了 Iceberg、Hudi、Paimon 后,最终选择 Paimon 作为我们湖仓一体的存储引擎,本文分享下自如在引入 Paimon 做数据集成的一些探索实践。
1207 1
Apache Flink 和 Paimon 在自如数据集成场景中的使用
|
SQL Java 关系型数据库
实时计算 Flink版产品使用合集之 TaskManager 上的所有 Managed Memory 占用率达到了 100%,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
223 0
|
SQL 存储 API
实时计算 Flink版产品使用合集之多个任务合并一个宽表该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
230 0
|
消息中间件 Java 数据库连接
实时计算 Flink版产品使用合集之将sdkMode从rpc模式改为jdbc模式后,table.exec.mini-batch.enabled参数还生效吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
163 0