当XML文件中含有ENTITY实体时,需要解析器,解析。主要步骤:
</pre></li></ol></p><pre name="code" class="java">DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true);//该解析器在解析时验证 XML 内容。 factory.setIgnoringElementContentWhitespace(true);//该解析器忽略元素内容中的可忽略空格。 factory.setExpandEntityReferences(true);//将工厂配置为生成扩展实体引用节点的解析器。 try { DocumentBuilder builder = factory.newDocumentBuilder(); MyEntityResolver resolver = new MyEntityResolver();//设置解析器 public class MyEntityResolver implements EntityResolver 该类继承自<span style="font-family: Arial, Helvetica, sans-serif;">EntityResolver </span> ErrorHandler handler = new MyErrorHandler();//设置<span style="font-family: Arial, Helvetica, sans-serif;">ErrorHandler 来捕获SAXParseException异常 public class MyErrorHandler implements ErrorHandler </span><pre name="code" class="java"> 该类实现了自<span style="font-family: Arial, Helvetica, sans-serif;">ErrorHandler接口</span>
builder.setEntityResolver(resolver);// builder.setErrorHandler(handler);doc = (Document) builder.parse(xmlFile);} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
程序架构:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration [ <!ELEMENT configuration (title)> <!ELEMENT title (font)> <!ELEMENT font (name,size,lable)> <!ELEMENT name ANY> <!ELEMENT size ANY> <!ELEMENT lable ANY> <!ENTITY label SYSTEM "label.dat"> ]> <configuration> <title> <font> <name>Helvetica</name> <size>36</size> <lable>&label;</lable> </font> </title> </configuration>
XML 的一些注意事项:- 开启验证之后,必须要声明类型 如configuraiton
- <?xml > 必须是一体的不能分开 <? xml>
- &label; ;不能少
package com.lmk.test.dom_xml; import java.io.File; import java.io.IOException; import javax.script.SimpleScriptContext; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import com.lmk.test.InfoUtil; public class DomXMLparser { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub DomXMLparser parser = new DomXMLparser(); File xmlFile = new File("test.xml"); if(!xmlFile.exists()){ parser.createFile(xmlFile); } Document doc=parser.getDoc(xmlFile); parser.parse(doc); } private void parse(Document doc) { // TODO Auto-generated method stub Element configuration = (Element) doc.getDocumentElement();//获得根节点 Element title = (Element) configuration.getFirstChild(); Element font = (Element) title.getFirstChild(); NodeList children = font.getChildNodes(); Node second = children.item(1); InfoUtil.info(second.getTextContent()); Node third = children.item(2); InfoUtil.info(third.getTextContent()); } private Document getDoc(File xmlFile) { Document doc = null; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); factory.setIgnoringElementContentWhitespace(true); factory.setExpandEntityReferences(true); try { DocumentBuilder builder = factory.newDocumentBuilder(); MyEntityResolver resolver = new MyEntityResolver(); ErrorHandler handler = new MyErrorHandler(); builder.setEntityResolver(resolver); // builder.setErrorHandler(handler); doc = (Document) builder.parse(xmlFile); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return doc; } private void createFile(File xmlFile) { // TODO Auto-generated method stub try { xmlFile.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.lmk.test.dom_xml; import java.io.IOException; import java.io.InputStream; import java.net.URL; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class MyEntityResolver implements EntityResolver { @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { if(systemId != null){ InputStream in = this.getClass().getResourceAsStream("label.dat"); InputSource source = new InputSource(in); }else{ } return null; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } }
这里是错误的!!!!!!!!!重新审视 EntityResolver 的作用