Получение данных XML, присутствующих в дочернем узле в виде строки, с использованием JAXB - PullRequest
3 голосов
/ 09 мая 2011

Я использую JAXB для преобразования XML (Parent XML, FIXML) в строку. В этом XML один дочерний узел имеет другие данные XML (дочерний XML, FpML), для которых у меня есть схема (xsd). В схеме для родительского XML тип элемента, который имеет дочерний XML, определяется как String. Мне нужно, чтобы дочерний XML приходил как строка. Пожалуйста, дайте мне знать, какие изменения я должен сделать. Я относительно новичок в JAXB. Заранее спасибо .. !!

Ура, Шакти С

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

UPDATE

На основании ваших комментариев:

Привет .. Спасибо за ваш ответ .. @Blaise Doughan & @CoolBeans в вышеупомянутом пример, который вы приводите, вы упомянули Строковое значение, но по моему xml, вместо "String Value" там будет другой XML внутри него. лайк Ричард и мне нужно "Ричард" как строка в выводе. Пожалуйста, позволь мне знаю, что вы хотите больше информации. Спасибо .. Ура, Шакти. S

Вы можете использовать комбинацию @XmlAnyElement и реализацию DomHandler для обработки этого варианта использования. Для подробного примера см .:

<Ч />

ОБНОВЛЕНИЕ № 2

На основании ваших комментариев

Подскажите, пожалуйста, что такое изменение? нужно сделать в схеме чтобы сделать который подал "@XmlAnyElement", так как я я генерирую Java-классы на время сборки.

Вы можете использовать аннотацию схемы JAXB dom, чтобы сгенерировать XmlAnyElement для свойства:

XJC Call

xjc -d out -b bindings.xml dom.xsd

dom.xsd

<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.example.com/default"
    targetNamespace="http://www.example.com/default">

    <xs:element name="customer">
        <xs:complexType>
        <xs:sequence>
            <xs:element ref="address"/>
        </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="address">
        <xs:complexType>
        <xs:attribute name="street" type="xs:string"/>
        </xs:complexType>
    </xs:element>

</xs:schema>

bindings.xml

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="string.xsd">
            <jxb:bindings node="//xs:element[@name='customer']/xs:complexType/xs:sequence/xs:element[@ref='address']">
                <jxb:dom/>
            </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

Клиент

Свойство address на Customer будет помечено @XmlAnyElement:

package com.example._default;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.w3c.dom.Element;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "address"
})
@XmlRootElement(name = "customer")
public class Customer {

    @XmlAnyElement
    protected Element address;

    public Element getAddress() {
        return address;
    }

    public void setAddress(Element value) {
        this.address = value;
    }

}
<Ч />

ОРИГИНАЛЬНЫЙ ОТВЕТ

Возможно, вы ищете аннотацию @XmlValue. Например, если у вас был следующий класс:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD
public class Child {

    @XmlValue
    private String value;

}

Приведенный выше класс будет маршал:

<child>String Value</child>

В соответствующей XML-схеме тип дочернего элемента будет xs: string.

<xs:element name="child" type="xs:string"/>
1 голос
/ 20 февраля 2012

Я решил это сейчас с

@Column(name="xml")
@XmlJavaTypeAdapter(StringXmlAdapter.class)
public String getXml() {
    return this.xml;
}

..

public class StringXmlAdapter extends XmlAdapter<Object, String>
{
   private static final String XMLSTART = "<?xml version='1.0' encoding='UTF-8'?>";

    @Override
    public Object marshal(String v) throws Exception {

        return v;
    }

    @Override
    public String unmarshal(Object v) throws Exception {
        Document document = ((Node) v).getOwnerDocument();
        DOMImplementationLS domImplLS = (DOMImplementationLS) document
            .getImplementation();
        LSSerializer serializer = domImplLS.createLSSerializer();
        String str = serializer.writeToString((Node) v);
        String normalizedXml = normalizeXml(str);
        return normalizedXml;
    }

    private String normalizeXml(String xml){
        int beginIndex = xml.indexOf('>',XMLSTART.length()+1)+1;
        int endIndex = xml.lastIndexOf('<');
        return xml.substring(beginIndex, endIndex);
    }
}

Единственная проблема в том, что я получаю

<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">
<inner><something>lalala</something></inner></xml>

после сортировки

вниз не знаю, как удалить xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xs =" http://www.w3.org/2001/XMLSchema" xsi: type = "xs: string"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...