Объект сортировки JAXB со свойством типа List <Element>(@XmlAnyElement) не выводит значение узла - PullRequest
2 голосов
/ 16 сентября 2011

Следующий файл TPAExtensionsType.java, который я сгенерировал из файла XSD.

TPAExtensionsType.java

<code>/* 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="TPA_Extensions_Type">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;any processContents='skip' maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "TPA_Extensions_Type", propOrder = {"any"}) @XmlRootElement открытый класс TPAExtensionsType {@XmlAnyElement protected List any;/ ** * Получает значение свойства any.* *

* Этот метод доступа возвращает ссылку на текущий список, * не снимок.Поэтому любые изменения, которые вы вносите в возвращаемый список *, будут присутствовать внутри объекта JAXB.* Вот почему нет метода set для свойства any.* *

* Например, чтобы добавить новый элемент, выполните следующие действия: *

     *    getAny().add(newItem);
     * 
* * *

* В списке разрешены объекты следующих типов * * {@link Element} ** * / public List getAny () {if (any == null) {any = new ArrayList ();} вернуть this.any;}}

Ниже приводится отдельное приложение для преобразования вышеприведенного объекта в XML.

TestUtil.java

public class TestUtil {
    public static void main(String[] args) {
        TPAExtensionsType tpaExtensions = new TPAExtensionsType();
        Element consumerInfo = new DOMElement("ConsumerInfo");
        consumerInfo.setNodeValue("Some Info");
        tpaExtensions.getAny().add(consumerInfo);

        StringWriter sw  = new StringWriter();
        JAXBContext context;
        try {
            context = JAXBContext.newInstance(TPAExtensionsType.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.marshal(tpaExtensions, sw);
            System.out.println(sw.toString());
        } catch (JAXBException e) {
            e.printStackTrace();
        }

    }
}

Ниже приводится вывод:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tpaExtensionsType xmlns="SOME_NAMESPACE_ HERE">
    <ConsumerInfo xmlns="" xmlns:ns2="SOME_NAMESPACE_ HERE"/>
</tpaExtensionsType>

Проблема, с которой я сталкиваюсь:

Узел ConsumerInfo создан, но его значение не отображается в сгенерированном XML, хотя я установил его значение в моем отдельном приложении вышеКто-нибудь, пожалуйста, помогите мне исправить это и что вызывает эту проблему?

1 Ответ

3 голосов
/ 16 сентября 2011

Цитирование спецификации DOM на nodeValue ( выделение ):

Значение этого узла в зависимости от его типа; см. Таблицу выше . Когда он определен как ноль, установка его не имеет никакого эффекта.

Если немного прокрутить вверх, вы увидите таблицу, в которой упоминается, что узлы типа Element определены с null nodeValue. Я думаю, именно поэтому он не отображается в вашем XML, потому что установка его не имеет никакого эффекта .

Может быть, вы могли бы использовать Node.setTextContent(String textContent)?

Document doc = DocumentBuilderFactory.newInstance()
                  .newDocumentBuilder().newDocument();
Element consumerInfo = doc.createElement("consumerInfo");
consumerInfo.setTextContent("some info");
doc.appendChild(consumerInfo);
TPAExtensionsType tp = new TPAExtensionsType();
tp.getAny().add((Element) doc.getFirstChild());

JAXBContext jc = JAXBContext.newInstance(TPAExtensionsType.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(tp, System.out); 

выход

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tpaExtensionsType>
    <consumerInfo>some info</consumerInfo>
</tpaExtensionsType>
...