2

XML標準に技術的に適合しないデータでJAXBを使用しようとしています。特に、要素の名前は数字で始まるため、技術的に無効です。スキーマがどのように見えるかの概要は次のとおりです。

<xs:element name = "ITEM">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="01" />
            <xs:element name="08" />
            <xs:element name="10">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="10_A" />
                        <xs:element name="10_B" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            ...
            ...Many more elements...
            ...
        </xs:sequence>
    </xs:complexType>
</xs:element>

残念ながら、これを変更することはできません。完全なITEMは巨大であり、多くのレベルの深さがあるため、JAXBなどの自動化ツールを使用してクラスを作成する必要があります。そのために、XJCが受け入れるように、要素の名前の前に文字(この場合は「m」)を付けました。実行時に、入力をJavaオブジェクトにアンマーシャリングするために、XMLタグをJavaクラスにマップできることを期待していました。特に、次のようなものです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "m01",
    "m08",
    "m10",
    ...
})
@XmlRootElement(name = "ITEM")
public class ITEM {
    @XmlElement(name = "01")
    protected String m01;
    @XmlElement(name = "08")
    protected String m08;
    @XmlElement(name = "10")
    protected M10 m10;
    ...
}

M10は次のようになります。

@XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "m10a",
        "m10b",
        ...
})
public static class M10 {
    @XmlElement(name = "10_A")
    protected String m10a;
    @XmlElement(name = "10_B")
    protected String m10b;
    ...
}

JAXBが@XmlElementタグを入力のタグに一致させることができることを期待していましたが、残念ながら、JAXBには不適切なタグを持つこのビジネスがないため、これはうまくいきませんでした。誰かが興味を持っている場合、特定の例外は次のとおりです。

org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup

この問題を回避する方法について誰かアドバイスがありますか?JAXBが入力XMLを解析する前に(したがってこの問題を完全に回避して)入力XMLで正規表現スワップを実行できる可能性があるように感じますが、そのような方法で入力を変更することはかなり望ましくありません。

4

2 に答える 2

2

問題があるのは JAXB (JSR-222) 実装ではなく、基礎となるパーサーが使用されています。秘訣は、寛容な XML パーサーを見つけることです。

スタックス

このコンテンツを処理できる StAX (JSR-173) パーサーが見つかった場合は、次のことができます。

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StringReader xml = new StringReader("<ITEM><01>Hello World</01></ITEM");
        XMLStreamReader xsr = XMLInputFactory.newFactory().createXMLStreamReader(xml);
        ITEM item = (ITEM) unmarshaller.unmarshal(xsr);
    }

}

サックス

または、SAX パーサーが見つかった場合は、次の操作を実行できます。

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import org.xml.sax.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        JAXBContext jc = JAXBContext.newInstance(ITEM.class);
        UnmarshallerHandler unmarshallerHandler = jc.createUnmarshaller().getUnmarshallerHandler();
        xr.setContentHandler(unmarshallerHandler);

        StringReader xml = new StringReader("<ITEM><01>Hello World</01></ITEM");
        InputSource inputSource = new InputSource(xml);
        xr.parse(inputSource);

        ITEM item = (ITEM) unmarshallerHandler.getResult();
    }

}
于 2013-02-12T21:09:06.107 に答える
1

「技術的に無効な XML」ではありません。それは単純に XML ではありません。いくつかの XML 規則に従っていて、他の規則に従っていないものを処理する方法はありません。おそらく、適切な XML に変換する XML 修復ツールを見つける以外にはありません。

于 2013-02-13T13:11:54.170 に答える