java - 如何获取所有 XML 分支

标签 java xml xml-parsing

如何使用 Java 获取所有 XML 分支。

例如,如果我有以下 XML:

<?xml version="1.0" encoding="UTF-8"?>
<addresses xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation='test.xsd'>
    <address>
        <name>Joe Tester</name>
        <street>Baker street 5</street>
    </address>
    <person>
        <name>Joe Tester</name>
        <age>44</age>
    </person>
</addresses>

我想获取以下分支:

addresses

addresses_address

addresses_address_name

addresses_address_street

addresses_person

addresses_person_name

addresses_person_age

谢谢。

最佳答案

您可以使用任何模板引擎轻松获取 XML 根、它的节点和子节点名称。即速度,FreeMarker和其他,FreeMarker具有强大的 XML 处理新工具。您可以将 XML 文档放入数据模型中,模板可以通过多种方式从中提取数据,例如使用 XPath 表达式。 FreeMarker,作为一个 XML 转换工具,具有很多 better-known XSLT stylesheet万维网联盟 (W3C) 颁布的方法。

FrerMarker 支持使用 jaxen 的 XPath,XPath 表达式需要 Jaxen。 downlaod

FreeMarker 将使用 Xalan,除非您通过从 Java 调用 freemarker.ext.dom.NodeModel.useJaxenXPathSupport() 选择 Jaxen。


只需要一个模板,它将根据输入的 XML 生成所有 XML 分支。真正将运行时的任何 XML 放入数据模型 freemarker 将处理模板并生成与该 XML 结构对应的 XML 分支。如果您的 XML 结构将发生变化,则无需更改您的 Java 代码。即使您想要更改输出,更改也会出现在模板文件中,因此无需重新编译 Java 代码。

只需更改模板,即时更改。

FTL 文件 [一个模板用于创建 xml 分支名称的多个 XML 文档]

<#list doc ['/*' ] as rootNode>
  <#assign rootNodeValue="${rootNode?node_name}">
  ${rootNodeValue}
<#list doc ['/*/*' ] as childNodes>
  <#if childNodes?is_node==true>
      ${rootNodeValue}-${childNodes?node_name}
     <#list doc ['/*/${childNodes?node_name}/*' ] as subNodes>
      ${rootNodeValue}-${childNodes?node_name}-${subNodes?node_name}
     </#list>
  </#if>
</#list>
</#list>

过程模板的 XMLTest.Java

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import freemarker.ext.dom.NodeModel;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.ObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class XMLTest {

    public static void main(String[] args) throws SAXException, IOException,
            ParserConfigurationException, TemplateException {

        Configuration config = new Configuration();
        config.setClassForTemplateLoading(XMLTest.class, "");
        config.setObjectWrapper(new DefaultObjectWrapper());
        config.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER);

        Map<String, Object> dataModel = new HashMap<String, Object>();
              //load xml
        InputStream stream = XMLTest.class.getClassLoader().getResourceAsStream(xml_path);
            // if you xml sting then then pass it from InputSource constructor, no need of load xml from dir
        InputSource source = new InputSource(stream);
        NodeModel xmlNodeModel = NodeModel.parse(source);
        dataModel.put("doc", xmlNodeModel);
        Template template = config.getTemplate("test.ftl");

        StringWriter out = new StringWriter();
        template.process(dataModel, out);
        System.out.println(out.getBuffer().toString());

    }

}

最终输出

addresses
      addresses-address
      addresses-address-name
      addresses-address-street
      addresses-person
      addresses-person-name
      addresses-person-age

请参阅 1.XML Node Model 的文档2.XML Node MOdel

here 下载 FreeMarker 从here下载Jaxen

关于java - 如何获取所有 XML 分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23320696/

相关文章:

java - android 中最喜欢的按钮无法正常工作

java - jaxb编码 self 关系

xml-parsing - web.config 文件中密码非法字符中的“&”

android - 如何从 php webservice 在 android 应用程序 arraylist 中解析

java - 迭代参数化列表(原始列表类型分配后)

javascript - NetBeans 调试突然停止工作

xml - 如何编写 xsl 样式表来根据匹配标签的内容翻译文档的某些部分......之类的?

java - 存储二维数据的数据结构的想法?

Java路径变量不起作用

java - 如何使用java中的解析器从nmap XML字符串(IP,端口)获取信息