java - 将 XML 从标记重新格式化为属性和名称

标签 java xml

是否有人知道可以重新格式化 XML 的工具或 jar,例如:

<job>
    <id>7562882</id>
    <title>Techniker im Unterhalt (m/w) in Murten</title>
    <deleted>false</deleted>
</job>

致:

<job>
<property name="id">7562882</property>
  <property name="title">Techniker im Unterhalt (m/w) in Murten</property>
 <property name="deleted">false</property>
</job>

子节点来自:

<company>
        <id>40057210</id>
        <name>Roland Murten AG</name>
</company>

 <property name="company-id">40057210</property>
 <property name="company-name">Roland Murten AG</property>

Java 中的任何解决方案都很棒,但因为这不是一件简单的事情,所以我将在任何 OO 中使用解决方案。 谢谢。 我不想将值添加为标记的一部分,只是为了重新格式化。

最佳答案

以下 XSLT 转换即可完成此操作:

private static void transform(String xml) throws TransformerException {
    String xslt = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n" +
                  "  <xsl:output omit-xml-declaration=\"yes\"/>\n" +
                  // Transform child elements of <job>
                  "  <xsl:template match=\"job/*\">\n" +
                  "    <property name=\"{local-name(.)}\"><xsl:value-of select=\".\"/></property>\n" +
                  "  </xsl:template>\n" +
                  // Remove <company>, but transform children
                  "  <xsl:template match=\"company\">\n" +
                  "    <xsl:apply-templates select=\"node()\"/>\n" +
                  "  </xsl:template>\n" +
                  // Transform child elements of <company>
                  "  <xsl:template match=\"company/*\">\n" +
                  "    <property name=\"{local-name(..)}-{local-name(.)}\"><xsl:value-of select=\".\"/></property>\n" +
                  "  </xsl:template>\n" +
                  // Copy all other content unchanged
                  "  <xsl:template match=\"@*|node()\">\n" +
                  "    <xsl:copy>\n" +
                  "      <xsl:apply-templates select=\"@*|node()\"/>\n" +
                  "    </xsl:copy>\n" +
                  "  </xsl:template>\n" +
                  "</xsl:stylesheet>\n";
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer(new StreamSource(new StringReader(xslt)));
    transformer.transform(new StreamSource(new StringReader(xml)),
                          new StreamResult(System.out));
}

测试

public static void main(String[] args) throws Exception {
    transform("<job>\n" +
              "    <id>7562882</id>\n" +
              "    <title>Techniker im Unterhalt (m/w) in Murten</title>\n" +
              "    <deleted>false</deleted>\n" +
              "</job>\n");
    System.out.println();   System.out.println();
    transform("<company>\n" +
              "        <id>40057210</id>\n" +
              "        <name>Roland Murten AG</name>\n" +
              "</company>\n");
}

输出

<job>
    <property name="id">7562882</property>
    <property name="title">Techniker im Unterhalt (m/w) in Murten</property>
    <property name="deleted">false</property>
</job>

        <property name="company-id">40057210</property>
        <property name="company-name">Roland Murten AG</property>

关于java - 将 XML 从标记重新格式化为属性和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33939799/

相关文章:

java - Is n :1 observable:observer with generics possible in java?(观察者模式)

java - 有没有办法使用java将json格式的参数发送到已安装的Windows应用程序?

Android:如何使用包含布局的工具

XML 两个同名标签

Java DOM 通过 ID 获取元素

java - 在 bash 中调用 Java 可执行文件

java - 使用 Java 8 更好地替换嵌套 for 循环中的代码

android - 购物车图标未与操作栏中的计数器一起显示

php - 调用未定义函数 xml_parser_create()

xml - 如何在未安装 Excel 的情况下将 DBGrid 导出为 OOXML 格式(Excel 2007/2010 格式)?