假设我有一个包含xml数据的Java String:
String content = "<abc> Hello <mark> World </mark> </abc>";
现在,我试图将此String作为文本呈现在网页上,并高亮显示/标记单词“World”。标签“abc”可能会动态更改,那么我是否可以使用Java重命名String中最外层的xml标记?
我想将上面的String转换为如下所示的格式:
String content = "<i> Hello <mark> World </mark> </i>";
现在,我可以使用新的String来设置html内容并以斜体显示文本并突出显示World。
谢谢, 索尼
PS:我在BaseX xml数据库中使用xquery文件。 String内容本质上是xquery的结果,它使用ft:extract(),一个提取全文搜索结果的函数。
答案 0 :(得分:2)
使用正则表达式“解析”XML可能很麻烦。如果您的XML字符串可能比示例中使用的XML字符串更复杂,则应考虑将其作为真正的XML节点进行处理。
String newName = "i";
// parse String as DOM
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource(new StringReader(content)));
// modify DOM
doc.renameNode(doc.getDocumentElement(), null, newName);
此代码假定需要重命名的元素始终是最外层的元素,即根元素。
现在该文档是一个DOM树。它可以通过变换器转换回String对象。
// output DOM as String
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter sw = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(doc), new StreamResult(sw));
String italicsContent = sw.toString();
答案 1 :(得分:0)
也许是一个简单的正则表达式?
String content = "<abc> Sample text <mark> content </mark> </abc>";
Pattern outerTags = Pattern.compile("^<(\\w+)>(.*)</\\1>$");
Matcher m = outerTags.matcher(content);
if (m.matches()) {
content = "<i>" + m.group(2) + "</i>";
System.out.println(content);
}
或者,使用DOM解析器,找到外部标记的子级并打印它们,在所需的标记之前和之后作为字符串