【问题标题】:How to get Apache Axiom to correctly report source data line numbers when parsing XML解析 XML 时如何让 Apache Axiom 正确报告源数据行号
【发布时间】:2012-12-13 13:38:07
【问题描述】:

这就是我正在做的事情,基本上是从 Axiom 快速入门文档中复制/粘贴:

public GenericXmlParser(Reader input, String entryElementName, List<DciXmlMapping> dciXmlMappings) {
    this.input = OMXMLBuilderFactory.createOMBuilder(input).getDocument().getXMLStreamReader(false);
    this.dciXmlMappings = dciXmlMappings;
    this.entryElementName = new QName(entryElementName);
}

public FeedEntry next() {
    try {
        while (input.hasNext()) {
            if (input.getEventType() == XMLStreamReader.START_ELEMENT &&
                input.getName().equals(entryElementName)) {

                OMElement element =
                    OMXMLBuilderFactory.createStAXOMBuilder(input).getDocumentElement();
                // Make sure that all events belonging to the element are consumed so that
                // that the XMLStreamReader points to a well defined location (namely the
                // event immediately following the END_ELEMENT event).
                element.build();
                // Now process the element.
                return new FeedEntry(element.getLineNumber(), processEntryElement(element), ImmutableList.<String>of());
            }

            input.next();
        }

        return null;
    }
    catch (XMLStreamException e) {
        throw new ImpException(e);
    }
}

这可行,但问题是 element.getLineNumber() 返回的行号似乎总是-1。关于 getLineNumber() 方法的文档并不多,在源代码中想要定义行号的地方也不容易找到。为了让 Axiom 跟踪行号,我需要做一些额外的配置吗?

【问题讨论】:

    标签: xml apache stax axiom


    【解决方案1】:

    我怀疑行号信息仅与底层 StAX 解析器所能提供的一样好。 JRE 中的默认 StAX 实现在这方面做得不是很好,您可能想尝试 Woodstox 代替(应该只是包含额外的 JAR 或 maven 依赖项的情况)。

    【讨论】:

    • 没错——我们甚至在我注意到这个答案之前就切换到了 Woodstox,它给了我们正确的行号。 Axiom + Woodstox 是一个非常好的 XML 解析组合!
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    相关资源
    最近更新 更多