栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Java将补充Unicode字符序列化为XML文档

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Java将补充Unicode字符序列化为XML文档

由于我看不到任何答案,而且其他人似乎也有同样的问题,因此我进一步调查了…

为了找到错误的根源,我使用了Xalan 2.7.1的序列化程序源代码,该代码也在Xerces中使用。

org.apache.xml.serializer.dom3.LSSerializerImpl使用org.apache.xml.serializer.ToXMLStream,该扩展了org.apache.xml.serializer.ToStream。ToStream.characters(final
char chars [],final int起始,final
int长度)处理字符,并且不正确支持Unipre字符(请注意:org.apache.xml.serializer.ToTextSream(可与Transformer一起使用)在characters方法上做得更好,但它只处理纯文本,而忽略所有标记;人们会认为XML文件是文本,但由于某些原因,ToXMLStream不会扩展ToTextStream。

org.apache.xalan.transformer.TransformerIdentityImpl还使用org.apache.xml.serializer.ToXMLStream(由org.apache.xml.serializer.SerializerFactory.getSerializer(属性格式)返回),因此它也遭受相同的错误。

ToStream使用org.apache.xml.serializer.CharInfo来检查是否应将一个字符替换为String,因此该错误也可以在此处修复,而不是直接在ToStream中解决。CharInfo正在使用属性文件org.apache.xml.serializer.XMLEntities.properties,其中包含字符实体列表,因此更改此文件也可能是修复该错误的一种方式,尽管到目前为止,它仅是为特殊目的而设计的。
XML字符quot amp lt
gt。使ToXMLStream使用与包中的属性文件不同的唯一方法是在类路径中之前添加org.apache.xml.serializer.XMLEntities.properties文件,这不是很干净。

使用默认的JDK(1.6和1.7)时,TransformerFactory返回com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl,它使用com.sun.org.apache.xml.internal.serializer.ToXMLStream。在com.sun.org.apache.xml.internal.serializer.ToStream中,characters()有时会调用processDirty(),后者会调用accumDefaultEscape(),它可以更好地处理Unipre字符,但实际上似乎不起作用(也许不为Unipre字符调用processDirty)…

com.sun.org.apache.xml.internal.serialize.DOMSerializerImpl正在使用com.sun.org.apache.xml.internal.serialize.XMLSerializer,它支持unipre。奇怪的是,XMLSerializer来自Xerces,但是当xalan或xsltc在类路径上时,Xerces不会使用它。这是因为org.apache.xerces.dom.CoreDOMImplementationImpl.createLSSerializer使用的是org.apache.xml.serializer.dom3.LSSerializerImpl而不是org.apache.xerces.dom.DOMSerializerImpl。在类路径上使用serializer.jar时,将使用org.apache.xml.serializer.dom3.LSSerializerImpl。警告:xalan.jar和xsltc.jar都在清单中引用了serializer.jar,因此,如果serializer.jar位于同一目录中,并且xalan.jar或xsltc.jar位于类路径中,则它最终会位于类路径中!如果只有xercesImpl.jar和xml-
apis.jar在类路径上,则为org。

结论和解决方法:该错误位于Apache的org.apache.xml.serializer.ToStream类(在JDK中更名为com.sun.org.apache.xml.internal.serializer.ToStream)中。正确处理Unipre字符的序列化程序是org.apache.xml.serialize.DOMSerializerImpl(在JDK中重命名为com.sun.org.apache.xml.internal.serialize.DOMSerializerImpl)。但是,Apache在可用时更喜欢使用ToStream而不是DOMSerializerImpl,因此它可能在其他方面表现更好(或者只是重组)。最重要的是,它们甚至在Xerces
2.9.0中不赞成使用DOMSerializerImpl。因此,以下变通办法可能会产生副作用:

  • 当Xerces和Apache的序列化程序位于类路径上时,将“(doc.getImplementation())。createLSSerializer()”替换为“ new org.apache.xerces.dom.DOMSerializerImpl()”。

  • 当Apache的序列化程序位于类路径(例如由于xalan)而不是Xerces上时,请尝试将“(doc.getImplementation())。createLSSerializer()”替换为“ new com.sun.org.apache.xml.internal.serialize” .DOMSerializerImpl()”(必须进行回退,因为将来此类可能会消失)

这两种解决方法在编译时会产生警告。

我没有XSLT转换的解决方法,但这超出了问题的范围。我猜一个人可以转换到另一个DOM文档,并使用DOMSerializerImpl进行序列化。

其他一些解决方法,对于某些人来说可能是更好的解决方案:

  • 与变压器一起使用撒克逊人

  • 使用具有UTF-16编码的XML文档



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/609545.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号