Java XML-将字符转换为实体
我有以下XML:Java XML-将字符转换为实体,java,xml,xslt,entity,Java,Xml,Xslt,Entity,我有以下XML: <root><super-head>Text ☆ and "more" ♥?</super-head></root> 现在我想用它们的实体替换列表中的所有字符。最初我尝试使用正则表达式来实现这一点,但它不起作用。所以我假设必须使用Java或XSLT(这里我只能使用1.0) 在Java中,我尝试了以下方法: public void replaceStringForNode(Node node, Map<String, St
<root><super-head>Text ☆ and "more" ♥?</super-head></root>
现在我想用它们的实体替换列表中的所有字符。最初我尝试使用正则表达式来实现这一点,但它不起作用。所以我假设必须使用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);;
}
}
}
如何以最佳方式转换它或解决我的问题?如果将输出编码设置为
US-ASCII
,这将强制使用模式对所有非ASCII进行编码&nnnn代码>使用实体的代码点
transformer.setOutputProperty(OutputKeys.ENCODING, Charset.US-ASCII.name());
您的实体无法工作,因为XML中只定义了五个默认值。您必须在XML文档的开头声明它们
<!ENTITY star "☆">
<!ENTITY hearts "♥">
. . .
并将它们合并到您自己定制的EntityResolver
类中。实体映射不应该发生在DOM对象内部,而应该发生在将DOM序列化为流、写入器、字符串或字节数组的转换
步骤中
好,现在是答案的编辑部分
不要
只是不要使用外部DTD实体或特殊的解析技巧。让XML转换器使用其默认行为来解析或写出XML。让它在XML输出中写出数字实体。每个浏览器或XML解析器都知道如何处理它们。如果将输出编码设置为US-ASCII
,这将强制所有非ASCII都使用模式&nnnn代码>使用实体的代码点
transformer.setOutputProperty(OutputKeys.ENCODING, Charset.US-ASCII.name());
您的实体无法工作,因为XML中只定义了五个默认值。您必须在XML文档的开头声明它们
<!ENTITY star "☆">
<!ENTITY hearts "♥">
. . .
并将它们合并到您自己定制的EntityResolver
类中。实体映射不应该发生在DOM对象内部,而应该发生在将DOM序列化为流、写入器、字符串或字节数组的转换
步骤中
好,现在是答案的编辑部分
不要
只是不要使用外部DTD实体或特殊的解析技巧。让XML转换器使用其默认行为来解析或写出XML。让它在XML输出中写出数字实体。每个浏览器或XML解析器都知道如何使用它们。您能在没有符号的情况下保存实体吗<代码>♥ = 心代码>@notyou否它必须是有效的实体为什么对XSLT 1.0的限制如果您也使用Java,其中Saxon 9作为XSLT 2或3的一种参考实现,并且使用它们,您可以使用字符映射轻松解决任务(请参见)?@MartinHonnen,因为我不允许使用它:(可能的副本您是否可以在不使用符号的情况下保存实体?♥ = heart;
@notyou no它必须是一个有效的实体为什么对XSLT 1.0的限制如果您也使用Java,其中Saxon 9作为XSLT 2或3的一种参考实现,并且使用它们,您可以使用字符映射轻松解决任务(请参阅)?@MartinHonnen,因为我不允许使用它:(可能重复感谢您的回答。这里我有一个问题,即使用了&&9734;
,而不是&star;
-如何使用&star;
,而不是&&9734;
?p.s.如果解析器不处理DTD实体的映射,那么在我的DTD文件中使用非标准实体来定义所有实体都是有问题的。可以吗在本例中,您可以举一个如何使用EntityResolver
的例子?一些解析器明确禁止外部实体声明来阻止诸如Double之类的攻击,谢谢您的回答。这里我有一个问题,即使用和而不是&star;
-如何使用&star;
而不是☆;
?请注意,如果您的解析器不处理DTD实体的映射,则使用非标准实体在我的DTD文件中定义所有实体是有问题的。您可以举一个例子,说明我如何在本例中使用EntityResolver
?一些解析器明确禁止外部实体声明来阻止攻击,例如生长激素
String org.apache.commons.text.StringEscapeUtils.escapeHtml4(String input)
String org.apache.commons.text.StringEscapeUtils.escapeXml10(String input)