java - 如何在 Java 中创建具有多个模式的 XML 文档?

标签 java xml xsd jaxp xlink

我有 XSD,它描述自定义架构并导入 XLink(另一个架构)。

使用以下声明 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.'

我的错误在哪里?

最佳答案

使用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");

上面还展示了如何控制一般前缀。

关于java - 如何在 Java 中创建具有多个模式的 XML 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20427587/

相关文章:

java - CAS 4.2 获取LDAP属性

java - Scala 中两个纪元日之间的天数

java - 如何编译 AndEngine 源代码?

python - 如何在 python 中解析表示 xml.dom.minidom 节点的字符串?

c# - VS2015 中的 Xsd2Code 插件

java - 我需要使用什么 CSS 语法来访问 JavaFX 中 TitledPane 的标签?

xml - 使用通配符的 XPath-Query 不起作用

sql - SQL中查询XML有LIKE子句吗

c# - 针对 XSD 验证 XML 的最高效方法

xml - 如何将 GUID simpleType 添加到 XML 架构中?