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

在Java中解析XML时,请保留数字字符实体字符(例如``)

和选
2023-03-14
问题内容

我正在解析包含数字字符实体字符的XML,例如(但不限于)&#10; &#13; &lt; &gt;Java中的(换行符回车<>)。解析时,我将节点的文本内容附加到StringBuffer上,以便稍后将其写到文本文件中。

但是,当我将String写入文件或打印出文件时,这些unicode字符会被解析或转换为换行符/空格。

在Java中遍历XML文件的节点并将文本内容节点存储到String时,如何保留原始的数字字符实体字符符号?

演示xml文件的示例:

<?xml version="1.0" encoding="UTF-8"?>
<ABCD version="2">    
    <Field attributeWithChar="A string followed by special symbols &#13;  &#10;" />
</ABCD>

示例Java代码。它加载XML,遍历节点,并将每个节点的文本内容收集到StringBuffer。迭代结束后,它将StringBuffer写入控制台以及文件&#10; &#13;符号(但不写入符号)。

将这些符号存储到字符串中时,如何保留这些符号?请你帮助我好吗?谢谢。

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {   
    DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
    Document document = null;
    DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
    document = documentBuilder.parse(new File("path/to/demo.xml"));
    StringBuilder sb = new StringBuilder();

    NodeList nodeList = document.getElementsByTagName("*");
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            NamedNodeMap nnp = node.getAttributes();
            for (int j = 0; j < nnp.getLength(); j++) {
                sb.append(nnp.item(j).getTextContent());
            }
        }
    }
    System.out.println(sb.toString());

    try (Writer writer = new BufferedWriter(new OutputStreamWriter(
            new FileOutputStream("path/to/demo_output.xml"), "UTF-8"))) {
        writer.write(sb.toString());
    }
}

问题答案:

您需要先将所有XML实体转义,然后再将文件解析为Document。您可以通过使用与之对应的XML实体对“ &”号
进行转义来实现。就像是,&``&amp;

DocumentBuilder documentBuilder =
        DocumentBuilderFactory.newInstance().newDocumentBuilder();

String xmlContents = new String(Files.readAllBytes(Paths.get("demo.xml")), "UTF-8");

Document document = documentBuilder.parse(
         new InputSource(new StringReader(xmlContents.replaceAll("&", "&amp;"))
        ));

输出:

2A string followed by special symbols &#13;  &#10;


 类似资料:
  • 问题内容: 您如何解析存储在Java字符串对象中的xml? Java的XMLReader仅从URI或输入流中解析XML文档。无法从包含xml数据的字符串进行解析? 现在,我有以下内容: 在我的处理程序上,我有这个: 提前致谢 问题答案: 该SAXParser的可以读取的的InputSource。 一个 InputSource的 可以采取 读者 在其构造 因此,您可以通过StringReader来解

  • 我正在使用Lucene 3.0编写一位前队友的代码。3. 有一个注释声称QueryParser不能处理“特殊字符”,处理的一种方法是用空格替换“特殊字符”: 是正在使用的分析仪。(谢谢马克) 我假设“特殊字符”用于组合查询或某种通配符处理,因为缺少更好的术语。 有没有更好的函数可以解释查询字符串中的这些字符?

  • 试图删除所有不是0-9和句号的字母和字符。我正在使用,但它也删除了十进制,我如何也保留十进制呢?

  • 我正在尝试在java中解析JSON字符串以单独打印单个值。但是在运行程序时,我得到了以下错误- 我的班级看起来像- 让我知道我遗漏了什么,或者每次运行应用程序时都会出现错误的原因。如有任何意见,将不胜感激。

  • 我有需要删除尾随字符的字符串。有几种类型,下面是一些例子:

  • 实体字符 实体字符(ASCII Encoding Reference)是用来在代码中以实体代替与HTML语法相同的字符,避免浏览解析错误。它的两种表示方式,第一种为 & 外加实体字符名称,例如 &nbsp;,第二种为 & 加实体字符序号,例如  。 常用HTML字符实体(建议使用实体): 字符 名称 实体名 实体数 " 双引号 &quot; " & &符 &amp; & < 左尖括号(小于号) &