DIDLParser从DIDLContent生成XML和Parse XML 得到 DIDLContent

XML通过DIDLParser类的generate从DIDLContent生成。

            try{
                //使用didl得到answer,好像是一个xml,是String类型啊
                /*变成一个字符串*/
                answer = new DIDLParser().generate(didl);
            }
            catch (Exception ex)
            {
                throw new ContentDirectoryException(
                        ContentDirectoryErrorCode.CANNOT_PROCESS, ex.toString());
            }

是这个方法,实际是将DIDLContent变为一个xml

public String generate(DIDLContent content, boolean nestedItems) throws Exception {
    return this.documentToString(this.buildDOM(content, nestedItems), true);
}

protected String documentToString(Document document, boolean omitProlog) throws Exception {
    TransformerFactory transFactory = TransformerFactory.newInstance();
    Transformer transformer = transFactory.newTransformer();
    if(omitProlog) {
        transformer.setOutputProperty("omit-xml-declaration", "yes");
    }

    StringWriter out = new StringWriter();
    transformer.transform(new DOMSource(document), new StreamResult(out));
    return out.toString();
}

实际过程是:首先是DIDLContent经过BuildDOM来构造得到一个Document对象,然后对这个Document对象操作得到String类型对象。

protected Document buildDOM(DIDLContent content, boolean nestedItems) throws Exception {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    Document d = factory.newDocumentBuilder().newDocument();
    this.generateRoot(content, d, nestedItems);
    return d;
}

以下代码来自cling库:

xml经过parse之后,得到DIDLContent才能给app使用,parse的过程如下:

public DIDLContent parse(String xml) throws Exception {
    if(xml != null && xml.length() != 0) {
        DIDLContent content = new DIDLContent();
        this.createRootHandler(content, this);
        log.fine("Parsing DIDL XML content");
        this.parse(new InputSource(new StringReader(xml)));
        return content;
    } else {
        throw new RuntimeException("Null or empty XML");
    }
}

上面的函数调用了:

public void parse(InputSource source) throws ParserException {
    try {
        this.xr.parse(source);
    } catch (Exception var3) {
        throw new ParserException(var3);
    }
}

实际调用的是XMLReader(接口类)的方法parse:

import java.io.IOException;
import org.xml.sax.ContentHandler;
import org.xml.sax.DTDHandler;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;

public interface XMLReader {
boolean getFeature(String var1) throws SAXNotRecognizedException, SAXNotSupportedException;

void setFeature(String var1, boolean var2) throws SAXNotRecognizedException, SAXNotSupportedException;

Object getProperty(String var1) throws SAXNotRecognizedException, SAXNotSupportedException;

void setProperty(String var1, Object var2) throws SAXNotRecognizedException, SAXNotSupportedException;

void setEntityResolver(EntityResolver var1);

EntityResolver getEntityResolver();

void setDTDHandler(DTDHandler var1);

DTDHandler getDTDHandler();

void setContentHandler(ContentHandler var1);

ContentHandler getContentHandler();

void setErrorHandler(ErrorHandler var1);

ErrorHandler getErrorHandler();

void parse(InputSource var1) throws IOException, SAXException;

void parse(String var1) throws IOException, SAXException;

}

猜你喜欢

转载自blog.csdn.net/commshare/article/details/78677654
xml