TransformerFactory腐败<输入>和< br>里面的标签< html>标签

时间:2016-03-09 17:35:45

标签: java xml parsing

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

INPUT:

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

给出OUTPUT(格式不正确):

<html>
<input>
</html>
&p;同样的事情发生在&lt;输入/&gt;,或&lt; br /&gt;。

它不会发生在&lt; html2&gt;,与其他标签,...

代码是经典的:

// 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();

这是一个已知的错误?

1 个答案:

答案 0 :(得分:3)

XSLT定义output method,可以是xmlhtmltext

规范说如果根节点是html,则默认输出方法应该是<html>,否则它应该是xml

使用xml方法,您将获得<input/>

使用html方法,您将获得<input>,因为HTML specification表示

如果需要,您可以明确地给出输出方法:

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

因此,具有<html>根节点的文档将输出XML,即<input/>

<强>行情

XSLT output method

  

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

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

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

HTML empty tags

  

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