【问题标题】:How to rename an xml node to a html tag如何将 xml 节点重命名为 html 标记
【发布时间】:2011-02-10 04:53:30
【问题描述】:

假设我有一个 Java 字符串,其中包含这样的 xml 数据:

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

现在,我试图将此字符串呈现为网页上的文本并突出显示/标记单词“World”。标签“abc”可以动态更改,那么有没有办法可以使用 Java 重命名字符串中最外层的 xml 标签?

我想把上面的String转换成如下所示的格式:

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

现在,我可以使用新的字符串来设置 html 内容并以斜体显示文本并突出显示单词 World。

谢谢, 索尼

PS:我在 BaseX xml 数据库中的文件上使用 xquery。字符串内容本质上是使用 ft:extract() 提取全文搜索结果的函数的 xquery 的结果。

【问题讨论】:

  • 你不能让你的 xquery 返回实际的 xml 对象吗?那么你就不需要重新解析它了,可以直接使用DOM方法,或者javax.xml.transform的一个实现。
  • 我同意@OrangeDog。如果您在 XML 树上使用 XQuery,则不需要将结果树转换为字符串(我猜这就是您的 ft:extract() 扩展正在做的事情)然后重新解析以进行转换......所有这些都可以在一个 XQuery 查询。此外,这里没有构建字符串后的 XQuery 部分。重新标记。

标签: java html xml


【解决方案1】:

使用正则表达式“解析”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 树。它可以通过转换器转换回字符串对象。

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

【讨论】:

    【解决方案2】:

    也许是一个简单的正则表达式?

        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 解析器,找到外部标签的子标签并将它们打印出来,在您想要的标签之前和之后作为字符串

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      相关资源
      最近更新 更多