Dom4j 解析Atom 文档

7 篇文章 0 订阅
3 篇文章 0 订阅

第一种方法遍历Dom树,不使用xpath

Element re=document.getRootElement();
List es=re.elements("entry");

for(int i=0;i<es.size();i++){
    Element currentItem=(Element)es.get(i);
    Element title=(Element)currentItem.elements("title").get(0);
    Element link=(Element)currentItem.elements("link").get(0);
    Element updated=(Element)currentItem.elements("updated").get(0);
    Element content=(Element)currentItem.elements("content").get(0);
}

document是完整的org.dom4j.Document文档对象,本文要说的是第二种,使用xpath,如果是rss,可以简单的使用类似下面的查询表达式

List<Node> list = document.selectNodes("//item");
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
    Node currentItem=(Node)iter.next();
    Element title=(Element)currentItem.selectSingleNode("./title");
    Element link=(Element)currentItem.selectSingleNode("./link");
    Element pubDate=(Element)currentItem.selectSingleNode("./pubDate");
    Element description=(Element)currentItem.selectSingleNode("./description");
}

如果Atom中也这样写,会取不得什么值,打印list.size()会发现是0,因为Atom有默认的名称空间:

xmlns="http://www.w3.org/2005/Atom"

所以需要在解析时先创建名称空间,或者在使用xpath的元素上注册或添加名称空间:

Map uris = new HashMap();
uris.put("atom", "http://www.w3.org/2005/Atom");

XPath xpath = document.createXPath("/atom:feed/atom:entry");
xpath.setNamespaceURIs(uris);
List<Node> list = xpath.selectNodes(document);
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
    Element currentItem=(Element)iter.next();
    Element title=(Element)currentItem.selectSingleNode("./title");
    Element link=(Element)currentItem.selectSingleNode("./link");
    Element pubDate=(Element)currentItem.selectSingleNode("./updated");
    Element description=(Element)currentItem.selectSingleNode("./content");
}

上面的代码在用xpath查询entry时使用Atom 名称空间,按理上这时没问题,可在取Element的值时控制台抛异常:java.lang.NullPointerException,在遍历时找到的Element无法使用,是不是少了名称空间前缀:atom,

Element title=(Element)currentItem.selectSingleNode("./atom:title");
Element link=(Element)currentItem.selectSingleNode("./atom:link");
Element updated=(Element)currentItem.selectSingleNode("./atom:updated");
Element content=(Element)currentItem.selectSingleNode("./atom:content");

奇怪了,还是抛异常:XPath expression uses unbound namespace prefix atom,原来在xpath查询entry时绑定的名称空间仅在entry时可用,下面就容易了,看一看文档Element或Node有没有增加名称空间的方法,还真有一个

public Element addNamespace(String prefix,
                            String uri)

currentItem.addNamespace("atom", "http://www.w3.org/2005/Atom");

加上此行后,代码跑起来了。我google发现也可以在文档根元素上绑定,这样在后续使用xpath时无需再添加名称空间,至于是否可行没实验过。


本文使用的dom4j是1.6.1,如果在你用的版本中使用上述代码有错误,请仔细阅读文档


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DOMdom4j都是用于解析XML文档的工具,它们的使用方法略有不同。下面分别介绍DOMdom4j解析XML的使用方法: 1. 使用DOM解析XML 使用DOM解析XML时,需要按照以下步骤进行: ```java // 1. 创建 DocumentBuilderFactory 对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 2. 创建 DocumentBuilder 对象 DocumentBuilder builder = factory.newDocumentBuilder(); // 3. 通过 DocumentBuilder 解析 XML 文件,得到 Document 对象 Document document = builder.parse(new File("xml文件路径")); // 4. 获取根节点 Element root = document.getDocumentElement(); // 5. 获取子节点、属性节点等 NodeList nodeList = root.getElementsByTagName("节点名称"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; // 获取子节点等操作 } else if (node.getNodeType() == Node.ATTRIBUTE_NODE) { Attr attribute = (Attr) node; // 获取属性节点等操作 } } ``` 2. 使用dom4j解析XML 使用dom4j解析XML时,需要按照以下步骤进行: ```java // 1. 读取 XML 文件 SAXReader reader = new SAXReader(); Document document = reader.read(new File("xml文件路径")); // 2. 获取根节点 Element root = document.getRootElement(); // 3. 获取子节点、属性节点等 List<Element> nodeList = root.elements("节点名称"); for (Element element : nodeList) { // 获取子节点等操作 List<Attribute> attributeList = element.attributes(); for (Attribute attribute : attributeList) { // 获取属性节点等操作 } } ``` 以上是DOMdom4j解析XML的基本使用方法。需要注意的是,使用DOM解析XML时,由于要将整个XML文档加载到内存中,因此对于大型XML文档,可能会出现内存溢出等问题。而dom4j相对于DOM,提供了更加方便的API和更高效的内存管理方式,因此在解析大型XML文档时,dom4j可能更加适合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值