`
wisfly
  • 浏览: 60908 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

转:解析XML时DTD的处理--解析时忽略,生成XML文件时加上。

 
阅读更多

小伙伴们,我开了一家海淘护肤品淘宝店,搜索店铺“禾子蝶的海淘铺”,正品保证,欢迎进店选购哦。谢谢!

解析XML时DTD的处理--解析时忽略,生成XML文件时加上。-- XML进阶

博客分类:

一、解析XML文件时,遇到DTD的定义要怎么办?

 

    下面这段代码是ibatis配置文件,用w3c Dom(其实任意一种解析方式都是这样)都会从http://www.ibatis.com/dtd/sql-map-config-2.dtd 这个地址找对应的DTD文件进行校验,如果因特网上这个地址不存在的话,就会报 java.net.ConnectException: Connection timed out: connect  。

 

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">  
  3. <sqlMapConfig>  
  4. <settings useStatementNamespaces="true"/>  
  5. <!--防止空SqlMap报错 by zhangbo start -->  
  6. <sqlMap resource="ibatis/project/project-blank.xml"/>  
  7.   
  8. <sqlMap resource="ibatis/project/user-mapping.xml"/>  
  9. </sqlMapConfig>  

 

   遇到这种问题可以有两种解析方式,第一把DTD下载的本地,指定从本地加载DTD文件;另一种,干脆忽略DTD文件。

这两种方式都是以重新构建实体的解析器(EntityResolver)为基础解决方案的,重新构建实体解析器而不是使用默认的实体解析器,因为默认的解析器会根据实际的url进行读取,下面是一段如何来解析上面提到的配置文件,两种方式都有标注

 

 

Java代码  收藏代码
  1. public void addToIbatisTotleConfig() {  
  2.         try {  
  3.             DocumentBuilderFactory factory = DocumentBuilderFactory  
  4.                     .newInstance();  
  5.               
  6.             factory.setIgnoringElementContentWhitespace(true);  
  7.             DocumentBuilder db = factory.newDocumentBuilder();            
  8.             db.setEntityResolver(new EntityResolver(){  
  9.             public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {                  
  10.                            if(publicId.equals("-//iBATIS.com//DTD SQL Map Config 2.0//EN")){  
  11.                               //这是第一种方式,即忽略DTD,新建一个默认的空XML来代替  
  12.                                return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='GBK'?>".getBytes()));  
  13.                                //这是第二种方式,即指定本地的DTD文件,当然,这种方式需要把XML文件下载到本地,放入对应的目录中  
  14.                               // InputStream dtd_stream = this.getClass().getResourceAsStream("..//dtd/sql-map-config-2.dtd");  
  15.                               //    return new InputSource(dtd_stream);  
  16.   
  17.                            }                            
  18.                     return null;  
  19.                 }});  
  20.             String ibatisTotalConfigFileName = ctx.getIbatisTotalConfigFile();  
  21.             File ibatisTotalConfigFile = new File(ibatisTotalConfigFileName);  
  22.             Document xmldoc = db.parse("file://localhost//"+ibatisTotalConfigFileName);  
  23.             Element root = xmldoc.getDocumentElement();  
  24.             } catch (Exception e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  

 

 

二、使用W3CDom编辑完上面的XML文件,把document转换为XML文件的时候,DTD定义会丢失,如果要加上,要怎么办?

       加DTD定义时,要在转换器中操作,重点使用这个两句代码:

Java代码  收藏代码
  1. transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());    
  2.           transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());  

 

DTD定义的值在document对象中是有的,你可以直接输出,也可以改变。

下面是我的实际应用

 

Java代码  收藏代码
  1. import java.io.File;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.FileOutputStream;  
  4.   
  5. import javax.xml.transform.Transformer;  
  6. import javax.xml.transform.TransformerConfigurationException;  
  7. import javax.xml.transform.TransformerException;  
  8. import javax.xml.transform.TransformerFactory;  
  9. import javax.xml.transform.dom.DOMSource;  
  10. import javax.xml.transform.stream.StreamResult;  
  11. import javax.xml.xpath.XPath;  
  12. import javax.xml.xpath.XPathConstants;  
  13. import javax.xml.xpath.XPathExpressionException;  
  14. import javax.xml.xpath.XPathFactory;  
  15.   
  16. import org.w3c.dom.Document;  
  17. import org.w3c.dom.Node;       
  18.   
  19.   
  20.   
  21. public static void saveXml(String fileName, Document doc) {// 将Document输出到文件     
  22.             TransformerFactory transFactory = TransformerFactory.newInstance();     
  23.             try {     
  24.                 Transformer transformer = transFactory.newTransformer();     
  25.                 transformer.setOutputProperty("indent""yes");     
  26.         
  27.                 DOMSource source = new DOMSource();     
  28.                 source.setNode(doc);    
  29.                 System.out.println(doc.getDoctype().getPublicId());  
  30.                    
  31.                 transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());    
  32.                 transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());  
  33.                 StreamResult result = new StreamResult();     
  34.                 result.setOutputStream(new FileOutputStream(fileName));     
  35.         
  36.                 transformer.transform(source, result);     
  37.             } catch (TransformerConfigurationException e) {     
  38.                 e.printStackTrace();     
  39.             } catch (TransformerException e) {     
  40.                 e.printStackTrace();     
  41.             } catch (FileNotFoundException e) {     
  42.                 e.printStackTrace();     
  43.             }     
  44.         }   

 

三、用w3c dom 解析带有DTD定义的XML时,会给一些元素自动加些一默认属性,例如:下面Spring的代码:

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans default-autowire="no" default-dependency-check="none"  
  4.     default-lazy-init="false">  
  5.     <bean autowire="default"  
  6.         class="org.springframework.context.support.ClassPathXmlApplicationContext"  
  7.         dependency-check="default" id="galaxyBaseContext" lazy-init="true">  
  8.         <constructor-arg>  
  9.             <list>  
  10.                 <value>spring/base-context.xml</value>  
  11.             </list>  
  12.         </constructor-arg>  
  13.     </bean>  
  14.     <bean autowire="default"  
  15.         class="org.springframework.context.support.ClassPathXmlApplicationContext"  
  16.         dependency-check="default" id="galaxyContext" lazy-init="true">  
  17.         <constructor-arg>  
  18.             <list>  

 

default-autowire="no" default-dependency-check="none" default-lazy-init="false" 这三个属性是自动加的,其实我只是用W3c Dom解析后改变了一个bean元素的属性值,但是解析完,bean都会加前面三个属性,很麻烦,也可以用第一种方法解决,设置DTD忽略,忽略以后并不会影响第二点讲的解析完增加DTD。

 

小伙伴们,我开了一家海淘护肤品淘宝店,搜索店铺“禾子蝶的海淘铺”,正品保证,欢迎进店选购哦。谢谢!

分享到:
评论

相关推荐

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    mybatis配置的重要文件包括mybatis-3-config.dtd mybatis-3-mapper.dtd

    jdom解析xml、dtd约束xml文件

    这是一个jdom解析xml的小例子、里面还有dtd文件的编写以及dtd文件约束xml文件。这是一个jdom解析xml的小例子、里面还有dtd文件的编写以及dtd文件约束xml文件。这是一个jdom解析xml的小例子、里面还有dtd文件的编写...

    mybatis-3-config/mapper.dtd 解决mybatis头文件报错

    然后打开eclipse -&gt;Window-&gt;prefenrence-&gt;XML-&gt;XML Catalog-&gt;User Specifiled Entreis-&gt;Add-&gt;Location(此处是你放dtd文件的位置例如:‪D:\mybatis\mybatis-3-config.dtd)-&gt;Key(如果更改config,此处应该是:-//...

    使用XmlDocumentXmlDataDocument类加载XML文件时如何忽略DTD验证

    在XML文件含有外部DTD验证的时候,使用XmlDocument/XmlDataDocument类的Load方法会抛出如下的例外: System.Xml.XmlException: 未找到所需的 DTD 标记。 行 m,位置 n。 我们可以采用下面的方法不去加载外部资源: ...

    myclipse编辑XML文件(如.hbm.xml)时自动提示

    当用myeclipse编辑xml文件时,如hibernate的配置文件,不能自动代码提示,网上都说是通过配置DTD方法,其实如我们使用myeclipse时根本不用配置,软件已经给我们配置好了,只需要做如下操作: 在Windows-----...

    DOM4J解析XML时DTD路径问题

    使用dom4j解析含有这样dtd的xml文件时,它会从网络找到这个文件对xml文件进行校验。但是如果电脑断开网络的话就会出现错误说找不到dtd文件并解析失败。所以请使用以下方法...

    XML转XSD\DTD工具

    XML转XSD\DTD工具 W3C XML Schema XSD 工具

    eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd

    eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd

    xml与DTD,xml与DTD

    xml与DTD,xml与DTD,xml与DTD,xml与DTD

    XML-DTD实例讲解

    XML入门精解之DTD 文件格式定义(XML DTD)  DTD实际上可以看作一个或多个XML文件的模板,这些XML文件中的元素、元素的属性、元素的排列方式/顺序、元素能够包含的内容等,都必须符合DTD中的定义。XML文件中的元素,...

    mybatis两个重要的dtd文件 batis-3-config.dtd mybatis-3-mapper.dtd

    mybatis两个重要的dtd文件 batis-3-config.dtd; mybatis-3-mapper.dtd

    使用DTD验证XML文档

    使用DTD验证XML文档 ...a) DTD使每个XML文件可以携带一个自身格式的描述。 b) DTD使不同组织的人可以使用一个通用DTD用来交换数据。 c) DTD使应用程序可以使用一个标准DTD校验从外部接收的XML数据是否有效。

    sql-map-config-2.dtd

    ibatis的xml文件对于这个xml文件的规制文件dtd文件

    xml-dtd文件配置

    xml-dtd文件配置

Global site tag (gtag.js) - Google Analytics