【问题标题】:java stax get string of inner nodejava stax 获取内部节点的字符串
【发布时间】:2010-11-10 21:19:25
【问题描述】:

我正在使用 java stax XMLStreamReader 来读取 xml。我想抓取某些内部节点的整个字符串。

XML:

<example>
   <ignoreMe>
      <bla></bla>
   </ignoreMe>
   <getMe>
      <data></data>
   </getMe>
</example>

我只想能够在字符串中获取整个内部 getMe 节点。即:

   <getMe>
      <data></data>
   </getMe>

这是我所拥有的……但我被困住了:

XMLStreamReader parser = factory.createXMLStreamReader(new FileReader(file)); 
for (int event = parser.next();  
event != XMLStreamConstants.END_DOCUMENT;
event = parser.next()) {

    switch (event) {
    case XMLStreamConstants.START_ELEMENT:
        if (parser.getLocalName().equals("GetMe")) {
             //??????????????????

【问题讨论】:

    标签: java xml stax


    【解决方案1】:

    我上周开始学习 StaX,但如果您仍在寻找问题的答案,这可能会对您有所帮助:

        XMLInputFactory xmlif = XMLInputFactory.newInstance();
        xmlif.setProperty(XMLInputFactory.IS_COALESCING, true);
        XMLStreamReader xmlsr;
        String resultat="";
        boolean isGetme=false;
    
        try {
            xmlsr = xmlif.createXMLStreamReader(new FileReader("lib/toto.xml"));
            int eventType;
            while (xmlsr.hasNext()) {
                eventType = xmlsr.next();
                switch (eventType) {
                    case XMLStreamConstants.START_ELEMENT:
                        if(xmlsr.getLocalName().equals("getMe")){
                            isGetme=true;
                        }
                        if(isGetme){
                            resultat+="<"+xmlsr.getLocalName()+">";
                        }
                        break;
                    case XMLStreamConstants.CHARACTERS:
                        if(isGetme){
                            resultat+=xmlsr.getText();
                        }
                        break;
                    case XMLStreamConstants.END_ELEMENT:
                        if(xmlsr.getLocalName().equals("getMe")){
                            resultat+="</"+xmlsr.getLocalName()+">";
                            isGetme=false;
                        }
                        if(isGetme && !xmlsr.getLocalName().equals("getMe")){
                            resultat+="</"+xmlsr.getLocalName()+">";
                        }
                        break;
                    default:
                        break;
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
        System.out.println(resultat);
    

    此代码将为您获取所有内部节点和文本内容,并将其存储到字符串中。 即:

    <getMe>
          <data>test</data>
    </getMe>
    

    但是,这段代码相当“丑陋”,肯定不是您所寻找的最佳解决方案,JDOM 可能更适合您的需求。

    【讨论】:

    • 谢谢.. 我最终使用了 JDOM。
    【解决方案2】:

    查看this

    检查方法parser.getElementText()

    HTH

    这将为您提供内部文本,您可以通过常规方法手动添加开始和结束名称。而且由于 XML 是一个严格的标准,所以没问题。

    【讨论】:

    • 不是我真正想要的,我的示例 xml 很简单,但实际上它很复杂并且包含要启动的注释。加上 parser.getElementText() 为我抛出了异常。
    猜你喜欢
    • 2011-05-20
    • 2011-03-19
    • 2022-01-06
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2013-10-17
    相关资源
    最近更新 更多