gpt4 book ai didi

java - 如何获取所有 XML 分支

转载 作者:行者123 更新时间:2023-11-29 08:49:51 59 4
gpt4 key购买 nike

如何使用 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/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com