2

このトピックに関連するすべての質問を検索しましたが、これに対する答えは見つかりませんでした。xmlドキュメントをjavaオブジェクトに変換しようとしています。同じことを行うためのオプションを検索した後、私は同じことを行うための最良のオプションとしてjaxbを見つけました。私は多くの記事を参照し、機能していないこの解決策を思いついた。誰かがこれで私を助けることができますか?

XML Dod:

<Vectors>
    <Vector>
        <Id>1</Id>
        <Name>abc</Name>
         <Desc>abcdefg</Desc>
         <Type>body</Type>
         <Snippet>
            <![CDATA[<total>1234</total>]]>
         </Snippet>
    </Vector>
    <Vector>
         <Id>2</Id>
         <Name>def</Name>
         <Desc>abcdefghigj</Desc>
         <Type>body</Type>
         <Snippet>
            <![CDATA[<total>12345</total>]]>
         </Snippet>
     </Vector>
</Vectors>

VectorクラスのJavaオブジェクトを2つ作成したいと思います。クラスベクトルは次のようになります

    package com.abc.TryXmltoJava;

    import java.util.List;
    import javax.xml.bind.annotation.*;

    public class Vector {
        int Id,
        String Name;
        String Desc;
        String Type;

        @XmlElement
        public String getName() {
             return Name;
        }
        public void setName(String name) {
             this.Name = name;
        }

        @XmlElement
        public String getDesc() {
            return Desc;
        }
        public void setDesc(String desc) {
            this.Desc = desc;
        }

        @XmlElement
        public String getType() {
            return Type;
        }
        public void setType(String type) {
            this.Type = type;
        }
}

これで、2つのオブジェクトを追跡し、listユーティリティを使用してVectorオブジェクトのリストを作成するVectorsクラスを作成しました。

 package com.abc.TryXMLtoObject;

 import javax.xml.bind.annotation.*;

 @XmlRootElement(name="Vectors")
 public class Vectors {

 @XmlElement(name="Vector")
     Vector vector;


     public Vector getVector() {
        return vector;
     }

     public void setVector(Vector vector1) {
        this.vector = vector1;
     }
}

Javaオブジェクトのリストを作成するこれらの2つのクラスを使用して、xmlオブジェクトのマーシャリングを解除しようとします。アンマーシャリングクラスは以下のとおりです。

  package com.abc.TryXMLtoObject;

  import java.io.File;
  import javax.xml.bind.JAXBContext;
  import javax.xml.bind.JAXBException;
  import javax.xml.bind.Unmarshaller;

  public class JAXBExampleUnmarshal {

       public static void main(String[] args) {

         try {

          File file = new File("C:\\file.xml");
          JAXBContext jaxbContext = JAXBContext.newInstance(Vectors.class);

          Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
          Vectors vectors = (Vectors) jaxbUnmarshaller.unmarshal(file);
          System.out.println(vectors);

         } catch (JAXBException e) {
          e.printStackTrace();
         }

   }
 }

このコードを実行した後、次のエラーが発生します。

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Vectors"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    at com.abc.TryXMLtoObject.JAXBExampleUnmarshal.main(JAXBExampleUnmarshal.java:17)
4

5 に答える 5

3

最初に、あなたは1つの単数ではなく、Vectorsを持っている必要があります。 また、stacktraceからのテキストは、xmlのどこかに要素があることを示していますが、それは間違っています。 最後に、2つの理由から、変数ではなくget-methodsにすべてのアノテーションを配置することを強くお勧めします。私の記憶が正しい場合は名前の衝突があり、次にHibernateなどのプロキシがある場合はフィールドからのアノテーションは消えますが、get-methodsのアノテーションは残ります。List<Vector> vectorListVector
unexpected element (uri:"", local:"Vkectors")Vkectors

于 2012-09-20T07:51:22.193 に答える
2

あなたの例の次のバージョンは私のために働いた:

ベクトル

popfalushiが指摘しているように、の多くのインスタンスを保持Vectorsするプロパティが必要です。ListVector

package com.abc.TryXmltoJava;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="Vectors")
@XmlAccessorType(XmlAccessType.FIELD)
public class Vectors {

    @XmlElement(name="Vector")
    List<Vector> vector;

}

ベクター

フィールドにJAXBアノテーションを指定する場合は@XmlAccessorType(XmlAccessType.FIELD)、タイプレベルで指定する必要があります( http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.htmlを参照)。また、デフォルトのマッピングでは@XmlElement、その注釈を明示的に追加する必要はありません( http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.htmlを参照)。

package com.abc.TryXmltoJava;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Vector {
    int Id;
    String Name;
    String Desc;
    String Type;
}

JAXBExampleUnmarshal

デモコードを更新して、オブジェクトをXMLに書き戻し、アンマーシャル操作中にオブジェクトが完全に入力されたことを証明しました。

package com.abc.TryXmltoJava;

import java.io.File;
import javax.xml.bind.*;

public class JAXBExampleUnmarshal {

    public static void main(String[] args) {

        try {
            File file = new File("C:\\file.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(Vectors.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            Vectors vectors = (Vectors) jaxbUnmarshaller.unmarshal(file);
            System.out.println(vectors);

            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(vectors, System.out);

        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

}

file.xml

<?xml version="1.0" encoding="UTF-8"?>
<Vectors>
    <Vector>
        <Id>1</Id>
        <Name>abc</Name>
         <Desc>abcdefg</Desc>
         <Type>body</Type>
         <Snippet>
            <![CDATA[<total>1234</total>]]>
         </Snippet>
    </Vector>
    <Vector>
         <Id>2</Id>
         <Name>def</Name>
         <Desc>abcdefghigj</Desc>
         <Type>body</Type>
         <Snippet>
            <![CDATA[<total>12345</total>]]>
         </Snippet>
     </Vector>
</Vectors>

出力

以下は、デモコードの実行からの出力です。

com.abc.TryXmltoJava.Vectors@44fe9319
<?xml version="1.0" encoding="UTF-8"?>
<Vectors>
   <Vector>
      <Id>1</Id>
      <Name>abc</Name>
      <Desc>abcdefg</Desc>
      <Type>body</Type>
   </Vector>
   <Vector>
      <Id>2</Id>
      <Name>def</Name>
      <Desc>abcdefghigj</Desc>
      <Type>body</Type>
   </Vector>
</Vectors>
于 2012-09-20T09:52:51.990 に答える
1

まず、スタックトレース名Vekctors(kに注意)なので、タイプミスの可能性があります。しかし、「期待される要素は(なし)」と表示されます。Vectorsクラスでは要素を宣言しただけなのでVector、要素内に2つの要素を配置することはできませんVectors

于 2012-09-20T07:56:03.397 に答える
1

オブジェクトを復元しようとする代わりに、最初にJavaでオブジェクトを作成し、JAXBを使用して永続化できますか?次に、XMLファイルとJAXBが生成するファイルの違いを確認します。

于 2012-09-20T07:53:15.433 に答える
1

xsdからクラスを生成するためのhosについて説明しているこの回答を確認することをお勧めします。また、rawxmlからxsdを生成するためのリソースへのリンクも提供します。

スタックトレースは「Vkectors」も参照しています-ソースファイルにタイプミスがありましたか?

最後に、jaxbチュートリアルから始めて、そこから上に進んでいくことをお勧めします。

幸運を!

于 2012-09-20T07:58:01.587 に答える