为什么 Transformer return &lt 和 &gt 而不是 < 和 >?

Why does Transformer return &lt and &gt instead of < and >?

trnsformer.transform(DomSource, streamResult);

DomSource 中的输入包含许多 <br> 标签,但我得到的是 &gt&lt 而不是 <> <br> return 作为 &lt br &gt

我知道 &lt &gt 等同于 <>。我怎样才能让 transformer class 改变编码和 return <br> 呢?

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

输入样本

<br>这是一个输入样本<br>

输出

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

问题出在这里:

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

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

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

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

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