Преобразование строки xml в объект Java
У меня есть следующая строка xml. Я хочу преобразовать его в объект java, чтобы сопоставить каждый тег с полями этого объекта. Лучше, если я могу ввести разные имена полей по сравнению с именем тега. Как я могу это сделать? Я смотрю на JAXB, но я все еще смущен такими частями, как" ns4:response " и теги в тегах. Заранее спасибо...
<ns4:response>
<count>1</count>
<limit>1</limit>
<offset>1</offset>
<ns3:payload xsi:type="productsPayload">
<products>
<product>
<avgRating xsi:nil="true"/>
<brand>Candie's</brand>
<description>
<longDescription>
long descriptions
</longDescription>
<shortDescription>
short description
</shortDescription>
</description>
<images>
<image>
<altText>alternate text</altText>
<height>180.0</height>
<url>
url
</url>
<width>180.0</width>
</image>
</images>
<price>
<clearancePrice xsi:nil="true"/>
<regularPrice xsi:nil="true"/>
<salePrice>28.0</salePrice>
</price>
</product>
</products>
</ns3:payload>
</ns4:response>
4 ответов
JAXB является стандартом Java (JSR-222) для преобразования объектов в/из XML. Должно помочь следующее:
Unmarshalling из строки
вам нужно будет обернуть String
в экземпляре StringReader
прежде чем ваш JAXB impl может unmarshal его.
StringReader sr = new StringReader(xmlString);
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Response response = (Response) unmarshaller.unmarshal(sr);
различные поля и имена XML
можно использовать @XmlElement
аннотация, чтобы указать, каким должно быть имя элемента. По умолчанию JAXB смотрит на свойства. Если вы хотите основывать сопоставления на полях, вам нужно установить @XmlAccessorType(XmlAccessType.FIELD)
.
@XmlElement(name="count")
private int size;
пространства имен
на @XmlRootElement
и @XmlElement
аннотации также позволяют указать квалификацию пространства имен, где это необходимо.
@XmlRootElement(namespace="http://www.example.com")
public class Response {
}
Дополнительные Информация
JAXB-хороший выстрел. Если у вас есть xsd-файл для этого документа, это будет очень легко. JAXB может генерировать Java-код для конкретной схемы.
Если у вас нет xsd-файла, вам необходимо самостоятельно подготовить классы Java. Ищите учебник JAXB и проверьте документациюhttp://jaxb.java.net/tutorial/.
Теги внутри тегов - это просто вложенные объекты для JAXB. ns4
- Это пространство имен. JAXB поддерживает пространства имен - просто посмотрите его в документации. Аннотации можно использовать для введения разные имена полей, чем теги в XML. Follwo документации.
Если у вас есть XSD для приведенного выше XML.
Я бы рекомендовал вам использовать Jaxb.
JAXB создает объекты java из XML-файлов.
Сначала вам нужно будет создать классы Java, используя генератор кода jaxb, который принимает XSD в качестве входных данных, а затем сериализовать/десериализовать эти xml-файлы соответствующим образом.
Если у вас уже есть xml и поставляется более одного атрибута, вы можете обработать его следующим образом:
String output = "<ciudads><ciudad><idCiudad>1</idCiudad>
<nomCiudad>BOGOTA</nomCiudad></ciudad><ciudad><idCiudad>6</idCiudad>
<nomCiudad>Pereira</nomCiudad></ciudads>";
DocumentBuilder db = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(output));
Document doc = db.parse(is);
NodeList nodes = ((org.w3c.dom.Document) doc)
.getElementsByTagName("ciudad");
for (int i = 0; i < nodes.getLength(); i++) {
Ciudad ciudad = new Ciudad();
Element element = (Element) nodes.item(i);
NodeList name = element.getElementsByTagName("idCiudad");
Element element2 = (Element) name.item(0);
ciudad.setIdCiudad(Integer
.valueOf(getCharacterDataFromElement(element2)));
NodeList title = element.getElementsByTagName("nomCiudad");
element2 = (Element) title.item(0);
ciudad.setNombre(getCharacterDataFromElement(element2));
ciudades.getPartnerAccount().add(ciudad);
}
}
for (Ciudad ciudad1 : ciudades.getPartnerAccount()) {
System.out.println(ciudad1.getIdCiudad());
System.out.println(ciudad1.getNombre());
}
метод getCharacterDataFromElement является
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "";
}