0

カスタム スキーマを記述し、XLink (別のスキーマ) をインポートする XSD があります。

インポートは、次の宣言 ix main XSD で行われます。

<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlink.xsd"/>

xlink.xsdファイルは実際にはメイン XSD の近くにあります。

次に、次のコードでビルダーを構成します

static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
static final String MY_SCHEMA_FILENAME = "mydir/myfile.xsd";
static final String MY_DATA_FILENAME = "mydir/myfile.xml";

factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        factory.setValidating(true);
        try {
            factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
            factory.setAttribute(JAXP_SCHEMA_SOURCE, new File(MY_SCHEMA_FILENAME));
        }
        catch (IllegalArgumentException e) {
            throw new AssertionError(e);
        }

        try {
            builder = factory.newDocumentBuilder();
        }
        catch(ParserConfigurationException e) {
            throw new AssertionError(e);
        }

メモリ内にドキュメントを準備するとき、次の方法で属性を設定します

imageElement.setAttribute("xlink:href", mypathvariable);

これにより、次の方法で説明されているタグが作成されると思いますXSD

                        <xs:element name="image">
                            <xs:complexType>
                                <xs:attribute ref="xlink:href" use="required"/>
                            </xs:complexType>
                        </xs:element>

作成中はすべてエラーなく動作しますが、コードで保存中は

        TransformerFactory transformerFactory = TransformerFactory.newInstance();

        Transformer transformer = transformerFactory.newTransformer();

        DOMSource source = new DOMSource(doc);

        StreamResult result = new StreamResult(new File(MY_DATA_FILENAME));

        transformer.transform(source, result);

次のエラーが発生します。

ERROR:  'Namespace for prefix 'xlink' has not been declared.'

私の間違いはどこですか?

4

1 に答える 1

1

代わりに、次のようなsetAttributeNSを使用します。

imageElement.setAttributeNS("http://www.w3.org/1999/xlink", "href", mypathvariable);

あなたが固執したい場合:

imageElement.setAttribute("xlink:href", mypathvariable);

次に、属性が追加される場所にスコープを提供するいくつかの要素で、これが定義されていることを確認します (通常はルート要素で):

someElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");

上記は、一般的にプレフィックスを制御する方法も示しています。

于 2013-12-06T15:46:45.697 に答える