我需要处理 XML DOM,最好使用 JDOM,我可以在其中对节点进行 XPath 搜索。我知道节点名称或路径,但我想完全忽略命名空间,因为有时文档带有命名空间,有时没有,而且我不能依赖特定的值。那可能吗?如何?
问问题
10977 次
4 回答
18
/ns:foo/ns:bar/@baz
变成
/*[local-name() = 'foo']/*[local-name() = 'bar']/@baz
你明白了。也不要指望这会闪电般快速。
于 2010-04-09T12:52:41.203 回答
4
我知道这个问题有点老了,但是对于那些稍后查看这个问题的人,您可以覆盖一些 JDOM 默认类以有效地使其也忽略名称空间。您可以将自己的 JDOMFactory 实现传递给忽略传递给它的所有命名空间值的 SAXBuilder。
然后覆盖 SAXBuilder 类并实现 createContentHandler 方法,以便它返回一个 SAXHandler,其中 startPrefixMapping 方法的定义为空白。
我没有在生产环境中使用过它,所以需要注意的是,但我已经证实它确实适用于我做过的一些快速而肮脏的 XML 东西。
于 2010-05-18T19:42:08.177 回答
4
您可以使用/*:foo
(XPath 2.0 或更高版本)或/yournamespace:*
按照此处的说明使用。
第一个变体选择具有匹配名称的所有节点,无论它们属于哪个命名空间,包括没有命名空间。后者选择属于特定命名空间的所有节点,而不考虑节点名称。
于 2010-11-25T19:24:31.083 回答
4
这是一个 jDOM2 解决方案,它已经在生产环境中运行了一年,没有遇到任何问题。
public class JdomHelper {
private static final SAXHandlerFactory FACTORY = new SAXHandlerFactory() {
@Override
public SAXHandler createSAXHandler(JDOMFactory factory) {
return new SAXHandler() {
@Override
public void startElement(
String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
super.startElement("", localName, qName, atts);
}
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
return;
}
};
}
};
/** Get a {@code SAXBuilder} that ignores namespaces.
* Any namespaces present in the xml input to this builder will be omitted from the resulting {@code Document}. */
public static SAXBuilder getSAXBuilder() {
// Note: SAXBuilder is NOT thread-safe, so we instantiate a new one for every call.
SAXBuilder saxBuilder = new SAXBuilder();
saxBuilder.setSAXHandlerFactory(FACTORY);
return saxBuilder;
}
}
于 2014-05-09T19:54:17.007 回答