gpt4 book ai didi

Java XML - 将字符转换为实体

转载 作者:行者123 更新时间:2023-12-01 17:51:13 25 4
gpt4 key购买 nike

我有以下 XML:

<root><super-head>Text ​☆ and "more" ♥?</super-head></root>

还有一些实体(实际上超过400个):

☆ = &star;
♥ = &heart;
" = &quot;
? = &quest;
- = &hyphen;

现在我想用它们的实体替换列表中的所有字符。最初我尝试使用正则表达式来做到这一点,但它不起作用。所以我假设必须使用Java或XSLT(我这里只能使用1.0)。

在Java中我尝试了以下方法:

public void replaceStringForNode(Node node, Map<String, String> map) {
// replace for all attributes
NamedNodeMap attributes = node.getAttributes();
for (int i = 0, l = attributes.getLength(); i < l; i++) {
Node attr = attributes.item(i);
String content = attr.getNodeValue();
for (Entry<String, String> entry : map.entrySet()) {
content = content.replace(entry.getKey(), entry.getValue());
}
attr.setNodeValue(content);
}

// check all child nodes
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node currentNode = nodeList.item(i);
int type = currentNode.getNodeType();
if (type == Node.ELEMENT_NODE) {
this.replaceStringForNode(currentNode, map);
} else if (type == Node.TEXT_NODE) {
String content = currentNode.setNodeValue();
for (Entry<String, String> entry : map.entrySet()) {
content = content.replace(entry.getKey(), entry.getValue());
}
currentNode.setNodeValue(content);;
}
}
}

但在这种情况下,我将得到以下 xml(带有转义的 & 字符):

<root><super-head>Text ​&amp;star; and &amp;qout;more&amp;qout; &amp;heart;&amp;quest;</super-head></root>

如何以最佳方式转换它或解决我的问题?

最佳答案

如果将输出编码设置为 US-ASCII,这将强制所有非 ascii 使用模式 &#nnnn; 使用代码点进行编码实体。

transformer.setOutputProperty(OutputKeys.ENCODING, Charset.US-ASCII.name());

您的实体不起作用,因为 XML 中仅定义了五个默认值。您必须在 XML 文档的开头声明它们。

<!ENTITY star     "&#9734;"> 
<!ENTITY hearts "&#9829;">
. . .

您可能必须使用能够理解 HTML 实体的 Apache 实用程序类:

String org.apache.commons.text.StringEscapeUtils.escapeHtml4(String input) 
String org.apache.commons.text.StringEscapeUtils.escapeXml10(String input)

并将它们合并到您自己的自定义EntityResolver类中。实体映射不应发生在 DOM 对象内部,而应发生在 DOM 序列化为流、写入器、字符串或字节数组的转换步骤中。

<小时/>

好的,现在是答案的编辑部分。

不要。

只是不要使用外部 DTD 实体或特殊的解析技巧。让 XML 转换器使用其默认行为来解析或写出 XML。让它在 XML 输出中写出数字实体。每个浏览器或 XML 解析器都会知道如何处理它们。

关于Java XML - 将字符转换为实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49921216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com