2011-02-10 71 views
1

说,我有一个Java字符串,它具有像这样的XML数据:如何将XML节点重命名为一个html标记

String content = "<abc> Hello <mark> World </mark> </abc>"; 

现在,我设法使这个String作为文本网页和hightlight上/标记“世界”一词。标签“abc”可以动态改变,所以有什么方法可以使用Java重命名String中最外层的xml标签?

我想上面的字符串转换为以下格式:现在

String content = "<i> Hello <mark> World </mark> </i>"; 

,我可以使用新的String设置HTML内容,并显示斜体字和突出的单词世界。

感谢, 索尼

PS:我使用XQuery超过在BaseX XML数据库文件。 String内容实质上是一个使用ft:extract()的函数来提取全文搜索结果的xquery结果。

+1

难道你不能让你的xquery返回实际的xml对象吗?然后,您不需要重新解析它,并可以直接使用DOM方法,或者使用javax.xml.transform的实现。 – OrangeDog 2011-02-10 11:01:41

+0

我同意@OrangeDog。如果你在XML树上使用XQuery,那么不需要将结果树转换为字符串(我想这就是你的`ft:extract()`扩展所做的),然后重新进行转换......所有这些可以在一个XQuery查询中完成。另外,在构建字符串之后,这里没有XQuery部分。重新标记。 – 2011-02-10 17:32:50

回答

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(); 
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解析器,找到最外层标签的孩子,并打印出来,之前和之后您需要的标签为字符串