Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML-将字符转换为实体_Java_Xml_Xslt_Entity - Fatal编程技术网

Java 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

我有以下XML:

<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     "&#9734;"> 
<!ENTITY hearts   "&#9829;"> 
      . . . 
并将它们合并到您自己定制的
EntityResolver
类中。实体映射不应该发生在DOM对象内部,而应该发生在将DOM序列化为流、写入器、字符串或字节数组的
转换
步骤中


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

不要


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

如果将输出编码设置为
US-ASCII
,这将强制所有非ASCII都使用模式
&nnnn使用实体的代码点

transformer.setOutputProperty(OutputKeys.ENCODING, Charset.US-ASCII.name());
您的实体无法工作,因为XML中只定义了五个默认值。您必须在XML文档的开头声明它们

<!ENTITY star     "&#9734;"> 
<!ENTITY hearts   "&#9829;"> 
      . . . 
并将它们合并到您自己定制的
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)