从xml中获取元素文本,该文本在节点内部不正确

时间:2015-04-06 07:28:21

标签: java xml stax

我有一个xml文件,我试图把文本放在< _3-auto>节点使用stax xml解析器。文本在任何节点内都不正确,因此stax无法获取该值。是否有其他方法可以使用stax获取值。

<_3-auto>
    <prefix>
        <autonum>(3)</autonum> 
    </prefix>
    Remove the rear fuselage support from FS755.00 of the aircraft.
</_3-auto>
<_3-auto>
    <prefix>
        <autonum>(4)</autonum> 
    </prefix>
    Put the hydraulic scissor lift (1) under the nose ballast assembly&#8201;(2).
</_3-auto>

这是我编写的用于获取_3-auto节点内文本的代码。

  try {
        XMLInputFactory inputFactory;
        inputFactory = XMLInputFactory.newInstance();
        InputStream inputStream = new FileInputStream(filePath);

        XMLStreamReader streamReader = inputFactory.createXMLStreamReader(inputStream);

        while (streamReader.hasNext()) {
            int event = streamReader.next();

            if (event == XMLStreamConstants.START_ELEMENT) {
                    if (streamReader.getLocalName().equals("_3-auto")) {
                        String auto = streamReader.getElementText();
                        System.out.println(auto);
                    }
            }

        }
    } catch (Exception e) {
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:0)

您不应该使用getElementText(),因为文档说它适用于纯文本元素

您需要做的是从XMLStreamConstants.CHARACTERS节点监视<_3-auto>事件。一种简单的方法是在解析中处理上下文,以了解您何时处于此类节点中。在这种情况下,我做了一个简单的假设,即在<_3-auto> StartElement事件之后或 </prefix> EndElement事件后,您在此节点中:

        boolean current3AutoNode = false;

        while (streamReader.hasNext()) {
            int event = streamReader.next();

            if (event == XMLStreamConstants.START_ELEMENT) {
                    if (streamReader.getLocalName().equals("_3-auto")) {
                        current3AutoNode = true;
                    }
                    else {
                        current3AutoNode = false;
                    }
            }
            else if (event == XMLStreamConstants.END_ELEMENT) {
                if (streamReader.getLocalName().equals("prefix")) {
                    current3AutoNode = true;    // after end of </prefix> we are back in <_3-auto> node
                }
                else {
                    current3AutoNode = false;
                }
            }
            if (event == XMLStreamConstants.CHARACTERS && current3AutoNode) {
                // these are the characters inside <_3-auto> </_3-auto>
                String characters = streamReader.getText();
                System.out.println(characters);
            }
        }

这将打印“从飞机FS755.00上拆下后机身支架”。和“将液压剪叉式升降机(1)放在机头压载组件(2)下面。”文本,还有一些可以过滤掉的空白字符。