2014-02-04 3 views
0

У меня есть бизнес-требование для генерации XML из классов (определенных в схеме) как можно более легкая форма. Для этого я удалил всю информацию пространства имен из xml.Заменить удаленные данные пространства имен на Unmarshal

Пример схемы:

<xs:schema xmlns="http://aschema/" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://aschema/" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified"> 

    <xs:element name="Test" type="TestType"/> 
    <xs:complexType name="TestType"> 
    <xs:sequence> 
     <xs:element name="test" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Формирует Test класс:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "TestType", propOrder = { 
    "test" 
}) 
@XmlRootElement(name = "Test") 
public class Test { 

    @XmlElement(required = true) 
    protected String test; 

    /** 
    * Gets the value of the test property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getTest() { 
     return test; 
    } 

    /** 
    * Sets the value of the test property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setTest(String value) { 
     this.test = value; 
    } 

} 

маршалов (я могу объяснить, как если вы хотите, но я думаю, что бы только загромождать вопрос - счастливый добавить если требуется):

<Test><test>Hello World!</test></Test> 

Теперь я хочу его развязать. Я получаю (на самом деле не удивительно):

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Test"). Expected elements are <{http://aschema/}Test> 

Есть ли способ я могу определить, к моему распаковать процесс, что использовать, когда речь идет по этой проблеме?

Я не могу изменить схему - это промышленный стандарт.

Я не могу изменить объект Test - он генерируется из схемы.

Все ссылки на эту ошибку, которую я могу найти, могут указывать либо на изменение класса java, либо на изменение схемы - я не могу сделать ни одну из этих вещей.

Обратите внимание, что мой класс Test является попыткой создать Minimal, Complete, Tested and Readable example. Реальные объекты, которые я хочу развернуть, намного сложнее.

+0

возможно дубликат [JAXB с объявленной распаковать типа не заселить полученный объект с данными] (http://stackoverflow.com/questions/17214930/jaxb-unmarshal-with-declared -type-does-not-populate-the-result-object-with-da) –

ответ

0

Как обычно - однажды я опубликовал проблему, появилось решение - как будто от Magic. Это StackOverflow для вас.

От JAXB unmarshal with declared type does not populate the resulting object with data

public class NamespaceFilter extends XMLFilterImpl { 

    private static final String NAMESPACE = "http://aschema/"; 

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 
    super.endElement(NAMESPACE, localName, qName); 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { 
    super.startElement(NAMESPACE, localName, qName, atts); 
    } 

} 

... 

    // Create the XMLFilter 
    XMLFilter filter = new NamespaceFilter(); 

    // Set the parent XMLReader on the XMLFilter 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    SAXParser sp = spf.newSAXParser(); 
    XMLReader xr = sp.getXMLReader(); 
    filter.setParent(xr); 

    // Set UnmarshallerHandler as ContentHandler on XMLFilter 
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
    UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler(); 
    filter.setContentHandler(unmarshallerHandler); 

    // Parse the XML 
    filter.parse(new InputSource(r)); 
    //Object result = unmarshallerHandler.getResult(); 
    T t = (T) unmarshallerHandler.getResult(); 
+1

@BlaiseDoughan - Извиняюсь, Блейз. Я столкнулся с такой большой работой в ходе моих исследований, и все это было невероятно полезно. Хорошо заслуженная позиция, предложенная. :) – OldCurmudgeon

Смежные вопросы