1

我们正在对嵌入式/嵌套 XML 执行一些操作。我正在使用 SAXParser 解析整个 XML 文件。我想获取带有标签和值的整个嵌套 XML。例如我的 XML 看起来像。

<ANY_ELEMENT>我想要.....</ANY-ELEMENT>标记中的整个 XML 。

<?xml version="1.0" encoding="UTF-8"?>
            <x:xMessage xmlns:x="http://www.connecture.com/integration/x" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                            xsi:schemaLocation="http://www.connecture.com/integration/x xMessageWrapper.xsd
                ">
                <x:xMessageHeader>
                    <Version>850</Version>
                    <Source>Source</Source>
                    <Target>target</Target>
                    <Timestamp>2013-12-31T12:00:00</Timestamp>
                    <RequestID>123456</RequestID>
                    <ResponseID>54321</ResponseID>
                    <Priority>3</Priority>
                    <Username>Deepak</Username>
                    <Password>Kumar</Password>
                </x:xMessageHeader>
                <x:xMessageBody>
                    <ANY-ELEMENT>
                        <xEnveloped_834A1 xsi:schemaLocation="....." xmlns="......."
                            ..........................
                    ..........................
                            some Complex XML
                        ..........................
                        ..........................
                        ..........................

                    </ANY-ELEMENT>

                 </x:XMessageBody>
        </x:XMessage>

处理程序类示例代码:

public class MessageWrapperHandler extends DefaultHandler {


    private boolean bActualMessage = false;
    private String actualMessage = null;
    private long lengthActualMessage=0;



    public void startElement(String uri, String localName, String qName, Attributes attributes) {

      if (qName.equalsIgnoreCase("ANY-ELEMENT")) {
            bActualMessage = true;
            //lengthActualMessage=How to know the length of Child XML
        }
    }
  public void characters(char ch[], int start, int length) {

         if (bActualMessage) {
            actualMessage = new String(ch, start, length);
            //trying to get embedded XML
            bActualMessage = false;
        }
    }

}

但是由于之后的下一个元素是 XML 内容,所以什么都不给我。所以如何实现它。 编辑:您可以在<ANY-ELEMENT>添加内容后自由修改 XMLCDATA

4

1 回答 1

0

我建议不要使用 SAX,而是使用 StAX(自 Java SE 6 起,JDK/JRE 中包含了一个 StAX 实现)。StAX 与 SAX 类似,只是不是将事件推送给您,而是您拉(请求)它们。

在下面的代码中,XMLStreamReader高级到ANY-ELEMENT元素。一旦它处于正确的位置,您就可以根据需要与它进行交互。

import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();

        StreamSource xmlSource = new StreamSource("src/forum19559825/input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(xmlSource);

        Demo demo = new Demo();
        demo.positionXMLStreamReaderAtAnyElement(xsr);
        demo.processAnyElement(xsr);
    }

    private void positionXMLStreamReaderAtAnyElement(XMLStreamReader xsr) throws Exception {
        while(xsr.hasNext()) {
            if(xsr.getEventType() == XMLStreamReader.START_ELEMENT && "ANY-ELEMENT".equals(xsr.getLocalName())) {
                break;
            }
            xsr.next();
        }
    }

    private void processAnyElement(XMLStreamReader xmlStreamReaderAtAnyElement) {
        // TODO: Stuff
        System.out.println("FOUND IT");
    }

}
于 2013-10-24T10:13:21.057 回答