Вы можете использовать JAXB, уже включенный в Java. Это довольно просто.
Сначала вам нужно создать привязку к вашему 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>