java - 使用SAX解析器,需要所有xml元素(在特定元素下)作为字符串

标签 java xml saxparser

我需要使用 sax 解析器将所有 xml 元素(在特定元素下)作为下面 xml 中的字符串。

示例 xml:

<root>
  <meta>
    <elememtA>xx</elememtA>
  </meta>
 <payload>
    <parent>
        <child1>a</child1>
   </parent>
   <parent>
        <child1>b</child1>
   </parent>
  </payload>
</root>

Sax 解析器实现:

public class UserHandler extends DefaultHandler {  
    @Override
    public void startElement(String uri, 
    String localName, String qName, Attributes attributes)
    throws SAXException {
    if (qName.equalsIgnoreCase("payload")) {
    //need all elements inside payload as string
}

例如,

我需要以下输出:

<parent><child1>a</child1></parent><parent><child2>b</child2></parent>

最佳答案

这是工作代码。 您可以在输出的底行看到结果。享受吧。

输出

2017-06-14 09:43:49 DEBUG SaxTest:94 - start document
2017-06-14 09:43:49 DEBUG SaxTest:107 - START -  - parent
2017-06-14 09:43:49 DEBUG SaxTest:107 - START -  - child1
2017-06-14 09:43:49 DEBUG SaxTest:33 - STRING : a
2017-06-14 09:43:49 DEBUG SaxTest:52 - END -  - child1
2017-06-14 09:43:49 DEBUG SaxTest:52 - END -  - parent
2017-06-14 09:43:49 DEBUG SaxTest:107 - START -  - parent
2017-06-14 09:43:49 DEBUG SaxTest:107 - START -  - child1
2017-06-14 09:43:49 DEBUG SaxTest:33 - STRING : b
2017-06-14 09:43:49 DEBUG SaxTest:52 - END -  - child1
2017-06-14 09:43:49 DEBUG SaxTest:52 - END -  - parent
2017-06-14 09:43:49 DEBUG SaxTest:41 - end document
2017-06-14 09:43:49 INFO  SaxTest:148 - RESULT 
<parent><child1>a</child1></parent><parent><child1>b</child1></parent>

Junit 中的代码 - 进行工作测试

package com.rizze.beans.labs.sof;

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

public class SaxTest {

    public static Logger logger = LoggerFactory.getLogger(SaxTest.class);


    public class SaxProcess implements ContentHandler {

        private boolean start= false;
        private static final String START_ITEM = "payload";
        private String result = "";

        @Override
        public void characters(char[] ch, int begin, int length) throws SAXException {
            if(start == true){
                logger.debug("STRING : "+new String(ch).substring(begin,begin+length));

                result+=new String(new String(ch).substring(begin,begin+length));
            }
        }

        @Override
        public void endDocument() throws SAXException {
                        logger.debug("end document");
        }

        @Override
        public void endElement(String uri, String localName, String name) throws SAXException {

            if(name!=null && name.compareToIgnoreCase(START_ITEM)==0){
                start = false;
            }
            else{
                if(start == true){
                    logger.debug("END - "+ localName + " - " + name);
                    result+="</"+name+">";
                }
            }


        }

        @Override
        public void endPrefixMapping(String prefix) throws SAXException {



        }

        @Override
        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {

        }

        @Override
        public void processingInstruction(String target, String data) throws SAXException {


        }

        @Override
        public void setDocumentLocator(Locator locator) {

        }

        @Override
        public void skippedEntity(String name) throws SAXException {


        }

        @Override
        public void startDocument() throws SAXException {
            start=false;
            result = "";

            logger.debug("start document");
        }

        @Override
        public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {

            if(name!=null && name.compareToIgnoreCase(START_ITEM)==0){
                start = true;
            }
            else{

                if(start == true){
                    //if already started ... go on
                    logger.debug("START - "+ localName + " - " + name);
                    result+="<"+name+">";
                }
            }


        }

        @Override
        public void startPrefixMapping(String prefix, String uri) throws SAXException {


        }

        /**
         * return resulting string
         * @return
         */
        public String getResult(){
            return result;
        }

    }





    @Test
    public void test() {


        String xml = "<root><meta><elememtA>xx</elememtA></meta><payload><parent><child1>a</child1></parent><parent><child1>b</child1></parent></payload></root>";
        InputSource in = new InputSource(new StringReader(xml));


            try {
                XMLReader  reader= SAXParserFactory.newInstance().newSAXParser().getXMLReader();
                SaxProcess p=new SaxProcess();
                reader.setContentHandler(p);
                reader.parse(in);
                logger.info("RESULT \n"+p.getResult());
            } catch (ParserConfigurationException | SAXException | IOException e) {
                e.printStackTrace();
            }

    }

}

关于java - 使用SAX解析器,需要所有xml元素(在特定元素下)作为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44543364/

相关文章:

java - 加快提取 Zip 文件

java - Tomcat错误信息 : java. lang.ClassNotFoundException : listeners. ContextListener/SessionListener/websocket.drawboard.DrawboardContextListener

java - 如何使用 Java 引用使用 Java Unsafe 释放内存?

java - 书籍对象的 boolean 值

java - 解析时调用 SAX error() 处理程序方法,但没有抛出异常 - 为什么?

android - 如何使用 AsyncTask 和 PublishProgress 获取 XML

java - SAX 解析器 : Retrieving HTML tags from XML

c# - 为大尺寸和正常尺寸的 xml 功能区按钮添加两个图像

php - 如何在 __soapcall() 函数中的 php 中发送 SOAP 请求中的参数

java - 删除少量节点的 XQuery