gpt4 book ai didi

xml - 使用 JAXB 提取 XML 元素的内部文本

转载 作者:数据小太阳 更新时间:2023-10-29 01:44:20 28 4
gpt4 key购买 nike

问题

给定以下 XML 配置文件:

<main>
<name>JET</name>
<maxInstances>5</maxInstances>
<parameters>
<a>1</a>
<b>
<b1>test1</b1>
<b2>test2</b2>
</b>
</parameters>
</main>

我需要提取 name 和 maxInstances 元素的值,然后提取 parameters 元素的整个内部文本。例如

name = "JET"
maxInstances = 5
parameters = "<a>1</a><b><b1>test1</b1><b2>test2</b2></b>"

最终,参数 block 可以包含任何格式良好的 XML。

尝试的解决方案

以下代码适用于 name 和 maxInstances 但不适用于参数:

@XmlRootElement(name="main")
public class Main {

@XmlElement(name="name", required="true")
private String name;

@XmlElement(name="maxInstances", required="true")
private Integer maxInstances;

@XmlElement(name="parameters")
private String parameters;

}

我尝试根据以下想法寻找解决方案,但找不到合适的东西。

是否有其他类型可用于代表 XML 树的参数对象,我可以解析它以生成字符串?例如

@XmlElement(name="parameters")
private XmlNodeObject parametersNode;

public String getParameters() {
// Collapse node to single line of text
return innerText;
}

或者我需要使用一些不同类型的注释吗?

@XmlSpecialAnnotation(...)
@XmlElement(name="parameters")
private String parameters;

我需要切换到不同风格的解析器吗?使用两种风格的解析器是好还是坏?

最佳答案

您可以使用@XmlAnyElement 注释as described by bmargulies .要映射到问题中的对象模型,您可以利用 DOMHandler

主要

import javax.xml.bind.annotation.*;

@XmlRootElement(name="main")
@XmlAccessorType(XmlAccessType.FIELD)
public class Main {

private String name;

private Integer maxInstances;

@XmlAnyElement(value=ParameterHandler.class)
private String parameters;

}

参数处理器

import java.io.*;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.annotation.DomHandler;
import javax.xml.transform.Source;
import javax.xml.transform.stream.*;

public class ParameterHandler implements DomHandler<String, StreamResult> {

private static final String PARAMETERS_START_TAG = "<parameters>";
private static final String PARAMETERS_END_TAG = "</parameters>";
private StringWriter xmlWriter = new StringWriter();

public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) {
return new StreamResult(xmlWriter);
}

public String getElement(StreamResult rt) {
String xml = rt.getWriter().toString();
int beginIndex = xml.indexOf(PARAMETERS_START_TAG) + PARAMETERS_START_TAG.length();
int endIndex = xml.indexOf(PARAMETERS_END_TAG);
return xml.substring(beginIndex, endIndex);
}

public Source marshal(String n, ValidationEventHandler errorHandler) {
try {
String xml = PARAMETERS_START_TAG + n.trim() + PARAMETERS_END_TAG;
StringReader xmlReader = new StringReader(xml);
return new StreamSource(xmlReader);
} catch(Exception e) {
throw new RuntimeException(e);
}
}

}

演示

import java.io.File;
import javax.xml.bind.*;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Main.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();
Main main = (Main) unmarshaller.unmarshal(new File("input.xml"));

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(main, System.out);
}

}

关于xml - 使用 JAXB 提取 XML 元素的内部文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5537416/

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