首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用stax/stax 2获取XML元素路径?

如何使用stax/stax 2获取XML元素路径?
EN

Stack Overflow用户
提问于 2016-12-12 19:25:57
回答 2查看 1.6K关注 0票数 0

我希望在使用java StAX2解析器解析XML时获得元素路径。如何获取有关当前元素路径的信息?

代码语言:javascript
复制
<root>
  <a><b>x</b></a>
</root>

在本例中,路径是/root/a/b

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-13 09:20:15

留一堆。在START_ELEMENT上推送元素名,并在END_ELEMENT上弹出它。

下面是一个简短的例子。它只会打印正在处理的元素的路径。

代码语言:javascript
复制
public static void main(String[] args) throws IOException, XMLStreamException {
    try (FileInputStream in = new FileInputStream("test.xml")) {

        XMLInputFactory factory = XMLInputFactory.newFactory();
        XMLStreamReader reader = factory.createXMLStreamReader(in);

        LinkedList<String> path = new LinkedList<>();

        int next;
        while ((next = reader.next()) != XMLStreamConstants.END_DOCUMENT) {
            switch (next) {
                case XMLStreamConstants.START_ELEMENT:
                    // push the name of the current element onto the stack
                    path.addLast(reader.getLocalName());
                    // print the path with '/' delimiters
                    System.out.println("Reading /" + String.join("/", path));
                    break;

                case XMLStreamConstants.END_ELEMENT:
                    // pop the name of the element being closed
                    path.removeLast();
                    break;
            }
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2016-12-15 01:23:59

“编年史上的责任”

方法1:专用堆栈@teppic建议

代码语言:javascript
复制
try (InputStream in = new ByteArrayInputStream(xml.getBytes())) {
    final XMLInputFactory2 factory = (XMLInputFactory2) XMLInputFactory.newInstance();
    final XMLStreamReader2 reader = (XMLStreamReader2) factory.createXMLStreamReader(in);
    Stack<String> pathStack = new Stack<>();
    while (reader.hasNext()) {
        reader.next();
        if (reader.isStartElement()) {
            pathStack.push(reader.getLocalName());
            processPath('/' + String.join("/", pathStack));
        } else if (reader.isEndElement()) {
            pathStack.pop();
        }
    }
}

方法2(丑陋):黑客攻击伍德斯托克斯氏 InputElementStack

  • 实现适配器来访问InputElementStack、其受保护的mCurrElement和插入父级(这会减慢algoritm)。 包com.ctc.wstx.sr;导入java.util.LinkedList;公共类StackUglyAdapter {公共静态字符串PATH_SEPARATOR = "/";私有InputElementStack堆栈;公共StackUglyAdapter(InputElementStack堆栈){ this.stack =堆栈;}公共字符串getCurrElementLocalName() {返回this.stack.mCurrElement.mLocalName;}公共字符串getCurrElementPath() { LinkedList列表=新LinkedList();元素el = this.stack.mCurrElement;时间(el != null) { list.addFirst(el.mLocalName);el = el.mParent;}返回PATH_SEPARATOR+String.join(PATH_SEPARATOR,list);}
  • 使用实例: 试试看(final InputStream in = new ByteArrayInputStream(xml.getBytes(){ XMLInputFactory2工厂= (XMLInputFactory2) XMLInputFactory.newInstance();XMLStreamReader2读取器= (XMLStreamReader2) factory.createXMLStreamReader(in);final StackUglyAdapter stackAdapter = new StackUglyAdapter(StreamReaderImpl) reader).getInputElementStack());while (reader.hasNext()) { reader.next();if (reader.isStartElement()) {reader.isStartElement}}

具有专用堆栈的方法1更好,因为它与API实现无关,并且与方法2一样快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41108090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档