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;
}