开发者

How to rename an xml node to a html tag

开发者 https://www.devze.com 2023-02-09 09:53 出处:网络
Say I have a Java String which has xml data like so: String content = \"<abc> Hello <mark> World </mark> </abc>\";

Say I have a Java String which has xml data like so:

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

Now, I seek to render this String as text on a web page and hightlight/mark the word "World". The tag "abc" could change dynamically, so is there a way I can rename the outermost xml tag in a String using Java ?

I would like to convert the above String to the format shown below:

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

Now, I could use the new String to set html content and display the text in italics and highlight the word World.

Thanks, Sony

PS: I am using xquery over files开发者_StackOverflow中文版 in BaseX xml database. The String content is essentially a result of an xquery which uses ft:extract(), a function to extract full text search results.


XML "parsing" with regexes can be cumbersome. If there is a possibility that your XML string can be more complicated than the one used in your example, you should consider processing it as a real XML node.

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);

This code assumes that the element to that needs to be renamed is always the outermost element, that is, the root element.

Now the document is a DOM tree. It can be converted back to String object with a transformer.

// 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();


Perhaps a simple regex?

    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);
    }

Alternatively, use a DOM parser, find the children of the outer tag and print them, preceded and followed by your desired tag as strings

0

精彩评论

暂无评论...
验证码 换一张
取 消