我需要处理一个XML DOM,最好使用JDOM,在节点上可以进行XPath搜索。我知道节点名称或路径,但我想完全忽略命名空间,因为有时文档带有命名空间,有时没有,我不能依赖于特定的值。这是否可能?如何实现?
我需要处理一个XML DOM,最好使用JDOM,在节点上可以进行XPath搜索。我知道节点名称或路径,但我想完全忽略命名空间,因为有时文档带有命名空间,有时没有,我不能依赖于特定的值。这是否可能?如何实现?
/ns:foo/ns:bar/@baz
变成
/*[local-name() = 'foo']/*[local-name() = 'bar']/@baz
你懂的,不要期望那是闪电般地快。
/*:foo
(XPath 2.0或更高版本)或/yournamespace:*
,如此所述。第一种变体选择所有具有匹配名称的节点,无论它们属于什么命名空间,包括没有命名空间的节点。后者选择属于特定命名空间的所有节点,而不考虑节点名称。这里有一个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;
}
}