Средство получения в сгенерированном xmlbeans классе, возвращающем null, и это не должно

#java #xml #parsing #xmlbeans

#java #xml #синтаксический анализ #xmlbeans

Вопрос:

Используя этот упрощенный XSD (упрощенный, но все еще подробный, как и все XSD, как правило,):

 <?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="[redacted]">
 <xsd:element name="Statement" type="BILLINGSTATEMENTTYPEType"/>

 <xsd:complexType name="BILLINGSTATEMENTTYPEType">
  <xsd:sequence>
   <xsd:element name="AccountSection" type="ACCOUNTSECTIONTYPEType"/>
   <xsd:element name="DataSection" type="DATASECTIONTYPEType"/>
   <xsd:element name="Summary" type="SUMMARYTYPEType"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="ACCOUNTSECTIONTYPEType">
  <xsd:sequence>
    <xsd:element name="Foo" type="xsd:string" maxOccurs="unbounded" minOccurs="0"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="DATASECTIONTYPEType">
  <xsd:sequence>
   <xsd:element name="Bar" type="xsd:string" maxOccurs="unbounded" minOccurs="0"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="SUMMARYTYPEType">
  <xsd:sequence>
   <xsd:element name="Baz" type="xsd:string" maxOccurs="unbounded" minOccurs="0"/>
  </xsd:sequence>
 </xsd:complexType>

</xsd:schema>
  

Я сгенерировал JAR-файл (используя <xmlbean> Ant-задачу из xmlbeans), и все выглядит великолепно, я получаю все нужные типы и еще много чего. Но когда я разберу этот упрощенный документ:

 <Statement>
    <AccountSection>
        <Foo>bar</Foo>
    </AccountSection>
    <DataSection>
    </DataSection>
    <Summary>
    </Summary>
</Statement>
  

Используя этот код:

 public class XmlTest {
    public static void main(String[] args) throws Exception {
        File xmlFile = new File("./data/test.xml");
        FileInputStream xmlStream = new FileInputStream(xmlFile);

        BILLINGSTATEMENTTYPEType statement = BILLINGSTATEMENTTYPEType.Factory.parse(xmlStream);

        ACCOUNTSECTIONTYPEType acctSection = statement.getAccountSection();

        System.out.println(statement.xmlText());
        System.out.println("acctSection is null:"   (acctSection == null));
    }
}
  

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

Вывод:

 <Statement>
    <AccountSection>
        <Foo>bar</Foo>
    </AccountSection>
    <DataSection>
    </DataSection>
    <Summary>
    </Summary>
</Statement>
acctSection is null:true
  

Почему это null? Почему все они равны null? Я неправильно определил что-то где-то в моем XSD? Я успешно использовал xmlbeans раньше и никогда не сталкивался с этой проблемой, поэтому я уверен, что мне чего-то не хватает, но я не смог это найти.

Ответ №1:

Я сам не занимаюсь экспортом в xmlbeans, но я заметил, что вы использовали фабрику сложного типа для синтаксического анализа xml. Можете ли вы попробовать использовать StatementDocument.Factory вместо этого?

Комментарии:

1. Это в значительной степени привело меня туда, куда мне нужно было идти. Затем возникла более серьезная проблема с пространством имен XML, но это помогло мне преодолеть эти дочерние элементы null, спасибо!

Ответ №2:

Моя проблема была решена путем добавления elementFormDefault="qualified" в пространство имен моего .xsd файла.