2015-02-25 2 views
0

JAXB выделяет первые элементы, встречающиеся в каждом типе в XML-документе, но оставляя дочерние элементы любых вложенных элементов одного и того же типа.Нулевые значения для развёртывания вложенных элементов в JAXB/MOXY

Вкратце, проблематична структура выглядит следующим образом:

sequence-> медиа-> аудио> track-> clipitem (-> последовательности и т.д. и т.п.)

Таким образом, clipitem также может иметь вложенное последовательность, и весь цикл может повторяться рекурсивно.

В первой обнаруженной последовательности всегда установлен носитель.

Однако для вложенной последовательности медиа-элемент всегда пустой (даже если он находится в XML)

классов были созданы с XJC из XSD.

Зачем использовать unmarshall как вложенные элементы? Помимо вложенных элементов все работает нормально. Есть ли что-то особенное для аннотирования вложенных элементов? Код и аннотации довольно просты.

Любые подсказки будут оценены. Спасибо, Джон

JAXBContext jc = JAXBContext.newInstance(Xmeml.class); 
Unmarshaller unmarshaller = jc.createUnmarshaller(); 
Xmeml xmeml = (Xmeml) unmarshaller.unmarshal(inFile); 


@XmlRootElement(name = "sequence") 
public class Sequence { 

    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected BigInteger duration; 
    @XmlElement(required = true) 
    protected Rate rate; 
    @XmlElement(required = true) 
    protected Timecode timecode; 
    @XmlElement(required = true) 
    protected BigInteger in; 
    @XmlElement(required = true) 
    protected BigInteger out; 
    @XmlElement(required = true) 
    protected Media media; 



@XmlRootElement(name = "clipitem") 
public class Clipitem { 

    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected BigInteger duration; 
    @XmlElement(required = true) 
    protected Rate rate; 
    protected boolean enabled; 
    @XmlElement(required = true) 
    protected BigInteger in; 
    @XmlElement(required = true) 
    protected BigInteger out; 
    @XmlElement(required = true) 
    protected BigInteger start; 
    @XmlElement(required = true) 
    protected BigInteger end; 
    @XmlElement(required = true) 
    protected String masterclipid; 
    protected boolean ismasterclip; 
    @XmlElement(required = true) 
    protected Labels labels; 
    @XmlElement(required = true) 
    protected Comments comments; 
    @XmlElement(required = true) 
    protected Sequence sequence; 

XML-огромна, но вот фрагмент, где средства массовой информации внутри последовательности равна нулю, когда оно не должно быть.

<track> 
     <clipitem id="Nested Sequence"> 
      <name>Nested Sequence</name> 
      <duration>815</duration> 
      <rate> 
       <ntsc>FALSE</ntsc> 
       <timebase>25</timebase> 
      </rate> 
      <in>0</in> 
      <out>815</out> 
      <start>815</start> 
      <end>1630</end> 
      <sequence id="Nested Sequence1"> 
       <name>Nested Sequence</name> 
       <duration>815</duration> 
       <rate> 
        <ntsc>FALSE</ntsc> 
        <timebase>25</timebase> 
       </rate> 
       <timecode> 
        <rate> 
         <ntsc>FALSE</ntsc> 
         <timebase>25</timebase> 
        </rate> 
        <string>01:00:00:00</string> 
        <frame>90000</frame> 
        <source>source</source> 
        <displayformat>NDF</displayformat> 
       </timecode> 
       <in>-1</in> 
       <out>-1</out> 
       <media> 
        <video> 
         <format> 
          <samplecharacteristics> 
           <width>1920</width> 
           <height>1080</height> 
           <anamorphic>FALSE</anamorphic> 
           <pixelaspectratio>NTSC-601</pixelaspectratio> 
           <fielddominance>lower</fielddominance> 
           <rate> 
            <ntsc>FALSE</ntsc> 
            <timebase>25</timebase> 
           </rate> 
+0

это выглядит okish, вы можете добавить XML, который не разобран правильно. – Zielu

+0

Я добавил фрагмент XML, в котором медиа-последовательность выходит нулевым. Весь XML массивный, поэтому лучше подумать не публиковать его все. –

+0

Место где-то все ваши бобы и exmple xml, который не отменяет правильное расписание (не достаточно целых только одна ветка с ошибкой) и добавьте ссылку на них. Таким образом, мы можем проверить, действительно ли unmarshalling не работает или что-то на вашей стороне. В принципе это должно сработать. Типичным виновником будут проблемы с пространством имен, но вы должны скорее получать сообщения об ошибках, не имеющие нулей. – Zielu

ответ

0

Ваши объекты дома не соответствуют xml. Например, последовательность имеет элемент uuid как первый, в то время как ваш bean имеет его как последний, «updatebehavior» полностью потерян. Аналогичные проблемы с другими фасолью. Приложенный xml-документ вообще не проверяет вашу модель jaxb, что, вероятно, является причиной того, что она не читается правильно.

Чтобы получить схему из модели:

JAXBContext con = JAXBContext.newInstance(Xmeml.class); 
File dir = new File("D:\\Temp\\schema"); 
con.generateSchema(new MySchemaOutputResolver(dir)); 

class MySchemaOutputResolver extends SchemaOutputResolver { 

    protected File baseDir; 

    public MySchemaOutputResolver(File dir) 
    { 
     super(); 
     baseDir = dir; 
    } 

    @Override 
    public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException { 
     return new StreamResult(new File(baseDir,suggestedFileName)); 
    } 
} 

для проверки по схеме, когда демаршаллизация:

JAXBContext con = JAXBContext.newInstance(Xmeml.class); 
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = sf.newSchema(new File("D:\\Temp\\schema\\schema1.xsd")); 
Unmarshaller umar = con.createUnmarshaller(); 
umar.setSchema(schema); 
Xmeml mem = (Xmeml)umar.unmarshal(new File("D:\\Temp\\testcase\\Surround Test.xml")); 
+0

Ничего себе. Это суетливо о заказе? Как заставить его не заботиться о упорядочивании элементов? Заказ будет проблемой, поскольку XML, который мне нужен для анализа, может отличаться по порядку и поступать из разных систем. Я создал их из XSD с XJC. XSD был переведен из DTD. Затем я отредактировал XSD, чтобы избавиться от частей, которые мне не нужны, и сделать более красивые классы. И что же мне делать? –

+0

Это не суетливый порядок, если он определен так в xsd. Если последовательность в схеме имеет порядок (следовательно, имя последовательности), если это мешок, это не делает. @XmlType (name = "", propOrder = {...}) на ваших бобах обеспечивает соблюдение этого порядка. Если вы удалите его, заказ остановит действие. XSD, который вы собираетесь использовать для генерации класса, должен соответствовать всем вашим форматам документов, которые вы можете получить, поэтому старайтесь удалить элементы, которые они должны быть отмечены как minOccurency = 0, поэтому они не требуются. – Zielu

+0

Тем не менее, если ваши xmls могут сильно различаться, генерируйте схему из классов и всегда используйте ее для валидации duarng unmarshaling, так что по крайней мере вы получите исключения, а не нулевые значения в ваших объектах. Таким образом, вы узнаете, что происходит, и можете обновить вашу модель jaxb, если вам нужно. – Zielu

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