当前位置: 首页 > 面试题库 >

Java,xml,XSLT:防止DTD验证

丌官丰羽
2023-03-14
问题内容

我使用Java(6)XML-Api在Web上的html文档上应用xslt转换。本文档的格式正确,是xhtml,因此包含有效的DTD-
Spec(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">)。现在出现一个问题:Uppon转换XSLT-
Processor尝试下载DTD,而w3-server则由于HTTP
503错误(由于w3的带宽限制)而拒绝了它。

如何防止XSLT处理器下载dtd? 我不需要我的输入文档经过验证。

来源是:

import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

-

   String xslt = "<?xml version=\"1.0\"?>"+
   "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">"+
   "    <xsl:output method=\"text\" />"+          
   "    <xsl:template match=\"//html/body//div[@id='bodyContent']/p[1]\"> "+
   "        <xsl:value-of select=\".\" />"+
   "     </xsl:template>"+
   "     <xsl:template match=\"text()\" />"+
   "</xsl:stylesheet>";

   try {
   Source xmlSource = new StreamSource("http://de.wikipedia.org/wiki/Right_Livelihood_Award");
   Source xsltSource = new StreamSource(new StringReader(xslt));
   TransformerFactory ft = TransformerFactory.newInstance();

   Transformer trans = ft.newTransformer(xsltSource);

   trans.transform(xmlSource, new StreamResult(System.out));
   }
   catch (Exception e) {
     e.printStackTrace();
   }

我在此处阅读了以下问题,但它们都使用另一个XML-Api:

  • “在XOM中解析XHTML文档时,DTD下载错误”

谢谢!


问题答案:

我最近在使用JAXB解组XML时遇到了这个问题。答案是从XmlReader和InputSource创建一个SAXSource,然后将其传递给JAXB
UnMarshaller的unmarshal()方法。为了避免加载外部DTD,我在XmlReader上设置了一个自定义EntityResolver。

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xmlr = sp.getXMLReader();
xmlr.setEntityResolver(new EntityResolver() {
    public InputSource resolveEntity(String pid, String sid) throws SAXException {
        if (sid.equals("your remote dtd url here"))
            return new InputSource(new StringReader("actual contents of remote dtd"));
        throw new SAXException("unable to resolve remote entity, sid = " + sid);
    } } );
SAXSource ss = new SAXSource(xmlr, myInputSource);

按照书面规定,如果自定义实体解析程序曾被要求解析您想要解析的实体以外的其他实体,则将引发异常。如果只希望它继续加载远程实体,请删除“ throws”行。



 类似资料:
  • 我们都知道DTD是用来精确描述XML文档,DTD根据相应XML语言的语法规则检查XML文档的结构和词汇的有效性。 现在检查DTD的有效性,可以使用以下程序 - 使用XML DTD验证工具 - 可以使用某些IDE(如XML Spy(非免费)和XMLStarlet(opensource)来验证针对DTD文档的XML文件。 使用XML DTD在线验证器 - W3C标记验证服务旨在验证Web文档。 使用在

  • 主要内容:使用 XSLT 显示 XML,在服务器上通过 XSLT 转换 XML通过使用 XSLT,您可以把 XML 文档转换成 HTML 格式。 使用 XSLT 显示 XML XSLT 是首选的 XML 样式表语言。 XSLT(eXtensible Stylesheet Language Transformations)远比 CSS 更加完善。 XSLT 是在浏览器显示 XML 文件之前,先把它转换为 HTML: XML 文件 XSLT 文件 如果您想要学习有关 XSLT

  • 问题内容: 假设我有一个非常简单的XML,带有空标记“ B”: 我目前正在使用XSLT删除一些标签,例如’C’: 到目前为止,还可以,但是问题是我最终得到了这样的输出: 当我真正想要的时候: 有没有办法防止“ B”崩溃? 谢谢。 问题答案: 好的,这对我有用:

  • 问题内容: 我需要针对DTD描述文件验证XML字符串(而不是文件)。 怎么做呢? 问题答案: 另一个不错的选择是lxml的验证,我觉得使用起来很愉快。 来自lxml站点的一个简单示例:

  • 我有一个XML文件,其结构如下: XSD模式: 和可视化的XSL文件(学生tylesheet.xsl): 我目前正在学习一门关于XML的短期课程,任务是在XML文件中构建给定的XSD模式和一些示例记录,然后最终使用XSLT将内容可视化为超文本标记语言。其中一项任务指出,我需要使用“urn:学生”作为结构的默认命名空间。然而,当我这样做的时候,我不会在最终的可视化中收到数据。当我从XML文件中删除“

  • 问题内容: 我需要转换具有嵌套(分层)结构形式的大型XML文件 变成更扁平(“切碎”)的形式,每个重复的嵌套块有1个块。 数据具有许多不同的标签和层次结构变化(尤其是在层次XML之前和之后的切碎XML的标签数量),因此,理想情况下,不应对标签和属性名称或层次级别进行任何假设。 仅4个级别的层次结构的顶层视图看起来像 然后所需的输出将是 也就是说,如果在每个级别上都有不同的组件,那么将产生总共不同的