您可以使用已包含在 Java 中的 JAXB。这很简单。
首先,您需要创建与 XML 代码的绑定。该绑定提供了 Java 对象和 XML 代码之间的映射。
一个例子是:
@XmlRootElement(name = "YourRootElement", namespace ="http://someurl.org")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"intValue",
"stringArray",
"stringValue"}
)
public class YourBindingClass {
protected int intValue;
@XmlElement(nillable = false)
protected List<String> stringArray;
@XmlElement(name = "stringValue", required = true)
protected String stringValue;
public int getIntValue() {
return intValue;
}
public void setIntValue(int value) {
this.intValue = value;
}
public List<String> getStringArray() {
if (stringArray == null) {
stringArray = new ArrayList<String>();
}
return this.stringArray;
}
public String getStringValue() {
return stringValue;
}
public void setStringValue(String value) {
this.stringValue = value;
}
}
然后,要将您的 Java 对象编码为 XML,您可以使用:
YourBindingClass yourBindingClass = ...;
JAXBContext jaxbContext = JAXBContext.newInstance(YourBindingClass.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);
/** If you need to specify a schema */
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new URL("http:\\www.someurl.org"));
marshaller.setSchema(schema);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, true);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
marshaller.marshal(yourBindingClass, stream);
System.out.println(stream);
将您的 XML 解析回对象:
InputStream resourceAsStream = ... // Your XML, File, etc.
JAXBContext jaxbContext = JAXBContext.newInstance(YourBindingClass.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object r = unmarshaller.unmarshal(resourceAsStream);
if (r instanceof YourBindingClass) ...
从 Java 对象开始的示例:
YourBindingClass s = new YourBindingClass();
s.setIntValue(1);
s.setStringValue("a");
s.getStringArray().add("b1");
s.getStringArray().add("b2");
// marshal ...
结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:YourRootElement xmlns:ns2="http://someurl.org">
<intValue>1</intValue>
<stringArray>b1</stringArray>
<stringArray>b2</stringArray>
<stringValue>a</stringValue>
</ns2:YourRootElement>
如果您不知道输入格式,那意味着您可能没有 XML 模式。如果您没有架构,您就没有一些它的好处,例如:
- 更容易描述允许的文档内容
- 更容易验证数据的正确性
- 更容易定义数据方面(数据限制)
- 更容易定义数据模式(数据格式)
- 不同数据类型之间的数据转换更容易
无论如何,前面的代码也适用于包含“未知”标签的 XML 代码。但是,您的 XML 代码仍然必须提供必填字段并遵循声明的模式。
所以下面的 XML 代码也是有效的。唯一的限制是:标签“stringValue”应该在那里。请注意,之前未声明“stringArrayQ”。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:YourRootElement xmlns:ns2="http://someurl.org">
<stringValue>a</stringValue>
<stringArrayQ>b1</stringArrayQ>
</ns2:YourRootElement>