0

私の問題をxmlで説明します。

最初に、名前空間を使用して xsd スキーマを定義しました。次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"           targetNamespace="http://www.example.org/schema"
xmlns:tns="http://www.example.org/schema" elementFormDefault="qualified">

<element name="Clients" type="tns:ClientsType"></element>


<complexType name="ContactType">
    <sequence>
        <element name="Type" type="string"></element>
    </sequence>
    <attribute name="ID" type="long" />
</complexType>


<complexType name="Contact">
    <sequence>
        <element name="ContactType" type="tns:ContactType"></element>
        <element name="Value" type="string"></element>
    </sequence>
    <attribute name="ID" type="long" />
</complexType>

<complexType name="ContactsType">
    <sequence>
        <element name="Contact" type="tns:Contact" maxOccurs="unbounded"></element>
    </sequence>

</complexType>


<complexType name="ClientType">
    <sequence>
        <element name="FirstName" type="string"></element>
        <element name="SecondName" type="string"></element>
        <element name="Contacts" type="tns:ContactsType"></element>
    </sequence>
    <attribute name="ID" type="long" />
</complexType>


<complexType name="ClientsType">
    <sequence>
        <element name="Client" type="tns:ClientType" maxOccurs="unbounded"></element>
    </sequence>
</complexType>

そのため、次のような明らかなxmlが生成されました。

<?xml version="1.0" encoding="UTF-8"?>
<tns:Clients xmlns:tns="http://www.example.org/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/schema schema.xsd ">
<tns:Client ID="0">
    <tns:FirstName>tns:FirstName</tns:FirstName>
    <tns:SecondName>tns:SecondName</tns:SecondName>
    <tns:Contacts>
        <tns:Contact ID="0">
            <tns:ContactType ID="0">
                <tns:Type>tns:Type</tns:Type>
            </tns:ContactType>
            <tns:Value>tns:Value</tns:Value>
        </tns:Contact>
    </tns:Contacts>
</tns:Client>

そして、データを含む特定のxmlを作成する私の関数:

            @Override
        public void printToFile() throws IOException, XMLStreamException {

        FileWriter fd = new FileWriter(outPath);
        Random rand = new Random();
        int end = rand.nextInt(1000);
        try{
        XMLOutputFactory xof = XMLOutputFactory.newInstance();
        XMLStreamWriter xtw = null;

    xtw = xof.createXMLStreamWriter(fd);


    xtw.writeStartDocument();

    //xtw.setPrefix("tns", "http://www.example.org/schema");
        xtw.writeStartElement("Clients");
        xtw.writeNamespace("tns", "http://www.example.org/schema");

     xtw.writeStartElement("tns","Client", "http://www.example.org/schema");
          //xtw.writeStartElement("Client");
            xtw.writeAttribute("ID", "1");
            xtw.writeStartElement("FirstName");
                xtw.writeCharacters("NameFirst");
            xtw.writeEndElement();
            xtw.writeStartElement("SecondName");
                xtw.writeCharacters("NameSecond");
            xtw.writeEndElement();
            xtw.writeStartElement("Contacts");
             for(int i=1;i<2;i++){
                    xtw.writeStartElement("Contact");
                        xtw.writeAttribute("ID",Integer.toString(i));
                        xtw.writeStartElement("ContactType");
                            xtw.writeAttribute("ID", Integer.toString(i));
                            xtw.writeStartElement("Type");
                                xtw.writeCharacters("mojTyp");
                            xtw.writeEndElement();                      
                        xtw.writeEndElement();
                            xtw.writeStartElement("Value");
                                xtw.writeCharacters("value");
                            xtw.writeEndElement();
                    xtw.writeEndElement();
             }

            xtw.writeEndElement();


        //xtw.writeEndElement();
        xtw.writeEndDocument();



    }catch(XMLStreamException xmlE)
    {

    }
    finally
    {
        fd.close();
    }

}

関数によって作成された xml を検証するために、Sax を使用して簡単な Junit テストを生成します。

@Test
public void testPrintToFileGoodXml() throws IOException,
        XMLStreamException, FactoryConfigurationError, SAXException {
    mService.printToFile();
    XMLStreamReader reader = XMLInputFactory.newInstance()
            .createXMLStreamReader(new FileInputStream(myPath));
    SchemaFactory factory = SchemaFactory
            .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

    Schema schema = factory.newSchema(new File(mySchemaPath));
    Validator validator = schema.newValidator();

    validator.validate(new StAXSource(reader));
    assertTrue(true);
}

しかし、テストは失敗したため、名前空間と xsd スキーマで定義されたその他のプロパティに接続された printToFile 関数に問題があると思います。解決方法がわかりません。多くのサイトと xsd の定義に関するドキュメントを読みましたが、まだ問題の解決方法がわかりません。助けてください。

4

1 に答える 1

1

スキーマは、ルート要素はクライアントでなければならないと言っています

スキーマのグラフィック表現

ただし、XMLスニペットには開始要素tns:Clientsがありますが、対応する終了要素はありません。writeEndElement呼び出しの集計を確認してください。

<?xml version="1.0" encoding="UTF-8"?>
<tns:Clients xmlns:tns="http://www.example.org/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/schema Contacts.xsd ">
    <tns:Client ID="0">
        <tns:FirstName>tns:FirstName</tns:FirstName>
        <tns:SecondName>tns:SecondName</tns:SecondName>
        <tns:Contacts>
            <tns:Contact ID="0">
                <tns:ContactType ID="0">
                    <tns:Type>tns:Type</tns:Type>
                </tns:ContactType>
                <tns:Value>tns:Value</tns:Value>
            </tns:Contact>
        </tns:Contacts>
    </tns:Client>
</tns:Clients> <--------- Missing
于 2012-05-29T10:19:01.417 に答える