2

良い時間!

私はxmlを持っています:

<fieldSet name="Test" desc="Test">
  <field name="id">
    <fieldinfo>
        <name>id</name>
        <type>String</type>
        <fieldsize>50</fieldsize>
    </fieldinfo>
    <validators />
  </field>
</fieldSet>

JAXBを使用して解析する必要があります。私はこれを試しました:

        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(CustomFieldSet.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

            StringReader reader = new StringReader(xml);
            CustomFieldSet fieldSet = (CustomFieldSet) unmarshaller.unmarshal(reader);

        } catch (Exception e) {
            logger.error(e.getMessage(), e); 
        }

CustomFieldSetクラスは次のように始まります。

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

@XmlAttribute(name = "name", required = true)
private String tableName;

@XmlAttribute(name = "desc", required = true)
private String tableDescription;

    ...

unmarshal()関数が呼び出されると、次の例外がスローされます。

javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException: Content is not allowed in prolog.]

この問題は、私のxmlにxml宣言が含まれていないという事実に関連していると思います(<?xml ...)。

ここでの回避策を知っている人はいますか?

4

2 に答える 2

2

StringReaderではなくInputStreamで動作するようにコードを変更しましたが、すべてが動作するようになりました。

try {
            XMLInputFactory xif = XMLInputFactory.newFactory();
            InputStream bis = new ByteArrayInputStream(tableDescription.getBytes("UTF-8"));
            XMLStreamReader xsr = xif.createXMLStreamReader(bis, "UTF-8");

            xsr.nextTag();

            JAXBContext jaxbContext = JAXBContext.newInstance(CustomFieldSet.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

            JAXBElement<CustomFieldSet> jb = unmarshaller.unmarshal(xsr, CustomFieldSet.class);
            xsr.close();

            fieldSet = jb.getValue();

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
于 2012-11-12T10:21:20.670 に答える
1

JAXB(JSR-222)の実装では、XMLヘッダー(つまり)は必要ありません<?xml version="1.0" encoding="UTF-8"?>。例については、以下を参照してください。あなたの例のXML文字列には何か特別なものがあるのではないかと思います。

Javaモデル(Foo)

package forum13341366;

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    private String bar;

}

デモコード

package forum13341366;

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

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StringReader xml = new StringReader("<foo><bar>Hello World</bar></foo>");
        Foo foo = (Foo) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
    <bar>Hello World</bar>
</foo>

于 2012-11-12T11:07:34.847 に答える