我想在我的JSF页面中使用非中断空格.我知道,在纯HTML中,我可以使用 这个,这很好.但是,当我将它们 放在Facelets页面中时,它会出现如下错误:
错误解析/page.xhtml:错误跟踪[第42行]引用了实体"nbsp",但未声明.
这是怎么造成的,我该如何解决?
我有程序需要解析包含字符实体的XML.程序本身不需要解决它们,它们的列表很大并且会发生变化,所以如果可以的话,我想避免明确支持这些实体.
这是一个简单的例子:
<?xml version="1.0" encoding="UTF-8"?>
<xml>Hello there &something;</xml>
Run Code Online (Sandbox Code Playgroud)
是否存在可以在不解析(非标准)字符实体的情况下成功解析文档的Java XML API?理想情况下,它会将它们转换为可以特殊处理的特殊事件或对象,但我会选择一种可以默默抑制它们的选项.
答案和示例:
Skaffman给了我答案:使用IS_REPLACING_ENTITY_REFERENCES设置为false 的StAX解析器.
这是我试图尝试的代码:
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
XMLEventReader reader = inputFactory.createXMLEventReader(
new FileInputStream("your file here"));
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if (event.isEntityReference()) {
EntityReference ref = (EntityReference) event;
System.out.println("Entity Reference: " + ref.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面的XML,它将打印" Entity Reference: something".
我有以下 XML:
<root><super-head>Text ?? and "more" ??</super-head></root>
Run Code Online (Sandbox Code Playgroud)
还有一些实体(实际超过400件):
? = ☆
? = &heart;
" = "
? = ?
- = ‐
Run Code Online (Sandbox Code Playgroud)
现在我想用它们的实体替换列表中的所有字符。最初我尝试使用正则表达式来做到这一点,但它不起作用。所以我假设必须使用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);
}
// …Run Code Online (Sandbox Code Playgroud)