【问题标题】:Why does Transformer return &lt and &gt instead of < and >?为什么 Transformer 返回 &lt 和 &gt 而不是 < 和 >?
【发布时间】:2016-03-07 14:22:28
【问题描述】:
trnsformer.transform(DomSource, streamResult);

DomSource 中的输入包含许多 &lt;br&gt; 标签,但我得到的是 &amp;gt&amp;lt 而不是 &lt;&gt; &lt;br&gt; 返回为 &amp;lt br &amp;gt

我知道&amp;lt &amp;gt 等价于&lt;&gt;。如何使转换器类更改编码并返回&lt;br&gt;

XML 创建者

public class CreatXML 
{ 

  public static void main(String[] args){

  try {
    File article = new File("article.txt");
    Scanner scan = new Scanner (article);
    StringBuilder str = new StringBuilder();
    while (scan.hasNext())
    { 
      str.append(scan.nextLine());
      str.append("<br>");
    }
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.newDocument();

    Element body  = doc.createElement("div");
    doc.appendChild(body);

    Attr classAttr = doc.createAttribute("class");
    classAttr.setValue("code");
    body.setAttributeNode(classAttr);

    Element p = doc.createElement("p");
    p.appendChild(doc.createTextNode(str.toString()));
    body.appendChild(p);

    TransformerFactory transFatory = TransformerFactory.newInstance();
    Transformer transformer = transFatory.newTransformer();
    DOMSource dom = new DOMSource(doc);

    StringWriter writer = new StringWriter();
    StreamResult result = new StreamResult(writer);
    transformer.transform(dom, result);
    System.out.println(writer.toString());

  }catch (Exception e){e.printStackTrace();}  
  }
}

输入样本

&lt;br&gt;这是一个输入样本&lt;br&gt;

输出

&lt;?xml [stuff] &gt;&lt;div&gt;&lt;p&gt;&amp;lt;br&amp;gt;这是一个输入样本&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/p&gt;&lt;/div&gt;

【问题讨论】:

  • 我在使用 Transformer 时没有看到这种行为。请编辑您的问题并提供说明您的问题的short but complete program,以及示例输入和 XSLT,以便其他人可以观察您的问题。
  • @VGR 感谢回复。问题已编辑。

标签: java xml transformer


【解决方案1】:

问题出在这里:

p.appendChild(doc.createTextNode(str.toString()));

您的文档中没有任何 &lt;br&gt; 元素。您有一个 &lt;p&gt; 元素,其文本内容包含出现的四个字符 &lt;br&gt;。根据格式良好的 XML,这些字符会按照您所看到的方式进行编码。

换句话说,createTextNode 不会创建 XML 元素。

您需要创建单独的文本节点和元素节点,而不是 StringBuilder:

while (scan.hasNext()) {
    p.appendChild(doc.createTextNode(scan.nextLine()));
    p.appendChild(doc.createElement("br"));
}

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2011-05-11
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多