5

我需要处理 XML DOM,最好使用 JDOM,我可以在其中对节点进行 XPath 搜索。我知道节点名称或路径,但我想完全忽略命名空间,因为有时文档带有命名空间,有时没有,而且我不能依赖特定的值。那可能吗?如何?

4

4 回答 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 回答