【问题标题】:TransformerFactory corrupts < input > and < br > tags inside < html > tagTransformerFactory 损坏 <html> 标签内的 <input> 和 <br> 标签
【发布时间】:2016-03-09 17:35:45
【问题描述】:

通过简单的代码解析和重写简单的xml,一些奇怪的事情发生了

输入:

<html>
<input></input>
</html>

给出输出(格式不正确):

<html>
<input>
</html>


也会发生同样的情况。

它不会出现在内部,与其他标签,...

代码很经典:

// READ XML
DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();

// PARSE
Document document = builder.parse(new InputSource(new StringReader(_xml_source)));

// WRITE XML

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(document), new StreamResult(buffer));
String output = buffer.toString();

这是一个已知的错误吗?

【问题讨论】:

  • 自动关闭的 html 标签立即浮现在我的脑海中......

标签: java xml parsing


【解决方案1】:

XSLT 定义了一个output method,它可以是xmlhtmltext

规范说如果根节点为&lt;html&gt;,则默认输出方式为html,否则为xml

使用xml 方法,您将获得&lt;input/&gt;

使用html 方法,您将得到&lt;input&gt;因为HTML specification 是这样说的

如果需要,您可以显式给出输出方法:

transformer.setOutputProperty(OutputKeys.METHOD, "xml");

这样带有&lt;html&gt; 根节点的文档将输出XML,即&lt;input/&gt;

行情

XSLT output method:

method 属性的默认选择如下。如果

  • 结果树的根节点有一个子元素,
  • 结果树的根节点(即文档元素)的第一个元素子元素的扩展名称具有本地部分html(大小写任意组合)和一个空命名空间 URI,以及
  • 结果树根节点的第一个子元素之前的任何文本节点仅包含空白字符,

则默认输出方式为html;否则,默认输出方法为xml。如果没有xsl:output 元素或xsl:output 元素都没有为method 属性指定值,则应使用默认输出方法。

HTML empty tags:

某些 HTML 元素类型没有内容。比如换行元素BR没有内容;它的唯一作用是终止一行文本。 这样的元素永远不会有结束标签。文档类型定义和规范文本指示元素类型是否为空(没有内容),或者如果它可以有内容,则认为什么是合法内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多