如何通过DOM在xml文档中插入schemalocation

如何通过DOM在xml文档中插入schemalocation,dom,xsd,jaxp,Dom,Xsd,Jaxp,我使用JAXP创建了一个xml文档,并搜索插入schemalocation的方法。 目前,我的应用程序生成: <?xml version="1.0" encoding="UTF-8"?> <root> ... </root> 谢谢您抽出时间, Kasten以下是如何向解析器提供提示以解决您的问题: 事情是这样的: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.s

我使用JAXP创建了一个xml文档,并搜索插入schemalocation的方法。 目前,我的应用程序生成:

<?xml version="1.0" encoding="UTF-8"?>
<root>
...
</root>
谢谢您抽出时间,

Kasten

以下是如何向解析器提供提示以解决您的问题:

事情是这样的:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLocation",
"http://www.example.com/Report.xsd");
下面是一个带有一些源代码的验证示例。这可能对你有帮助。


(如果情况更糟,您可以始终搜索和替换。我知道这不是理想的解决方案,但javax.xml.transform.OutputKeys似乎没有与schemalocation属性相关的成员。)

在xml数据模型中,命名空间节点实际上不是从父元素读取的,但每个元素都有自己的命名空间节点。因此,简单地向根元素添加一个新的默认名称空间是行不通的,但会产生这样的文档

<root xmlns="namespaceURL">
    <child xmlns=""/>
    ...
</root>
而不是使用

Transformer trans = transfac.newTransformer();
(创建一个进行标识转换的样式表),创建一个XSLT输入源,并将其作为参数提供给
newTransformer()

其中,
xsltFile
是指向该XSLT文件的
文件
对象

根据需要设置输出属性,并调用示例代码中的
transform()
。结果应该是您想要的,但是我没有用Java测试它。给定的XSLT文件在一些简单的情况下进行了测试,在这个答案的末尾有一个示例输入和输出

一些小注释:
  • 在此过程中不修改原始文档对象。新的默认名称空间仅出现在
    transform()
    方法的输出中
  • 架构实例命名空间的命名空间前缀通常是
    xsi:
    ,而不是示例代码中的
    xs:
    xs:
    用于架构定义(以及
    xsd:

  • 上面显示的XSLT样式表的输入和输出示例 输入:

    <root>
        <child>text</child>
        <child attribute="attr-value"/>
        <?pi-target pi-content?>
        <nsx:ns-child xmlns:nsx="ns1x">
            <no-ns-child>text</no-ns-child>
            <!-- comment -->
            <nsx:ns-child nsx:ns-attribute="nsx-attr-value">text</nsx:ns-child>
        </nsx:ns-child>
        <defns-child xmlns="default-ns">
            <def-child attr="val">text</def-child>
            <child xmlns=""/>
        </defns-child>
        <child>text</child>
    </root>
    
    
    文本
    文本
    文本
    文本
    文本
    
    输出:

    <?xml version="1.0" encoding="UTF-8"?>
    <root xmlns="namespaceURL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="namespaceURL pathToMySchema.xsd">
        <child>text</child>
        <child attribute="attr-value"/>
        <?pi-target pi-content?>
        <nsx:ns-child xmlns:nsx="ns1x">
            <no-ns-child>text</no-ns-child>
            <!-- comment -->
            <nsx:ns-child nsx:ns-attribute="nsx-attr-value">text</nsx:ns-child>
        </nsx:ns-child>
        <defns-child xmlns="default-ns">
            <def-child attr="val">text</def-child>
            <child xmlns="namespaceURL"/>
        </defns-child>
        <child>text</child>
    </root>
    
    
    文本
    文本
    文本
    文本
    文本
    
    创建文档时,可以在根目录中添加名称空间

    String NS_URL = "namespaceURL";
    
    doc = builder.newDocument();
    Element root = doc.createElementNS(NS_URL, "root");
    root.setAttributeNS("http://www.w3.org/2001/XMLSchema-instance", 
        "xs:schemaLocation", NS_URL + " pathToMySchema.xsd");
    doc.appendChild(root);
    
    然后,对于添加到文档中的每个元素,而不是createElement(),请使用CreateElements()

    这会产生你想要的结果

    <root 
        xmlns="namespaceURL"
        xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
        xs:schemaLocation="namespaceURL pathToMySchema.xsd"
        >
    

    感谢您的工作。这似乎只适用于某些ParserEngine。对我来说,它抛出了一个java.lang.IllegalArgumentException:无法识别属性“”。JAXP似乎没有提供一种向新的XML文档添加名称空间提示的简单方法。
    <root>
        <child>text</child>
        <child attribute="attr-value"/>
        <?pi-target pi-content?>
        <nsx:ns-child xmlns:nsx="ns1x">
            <no-ns-child>text</no-ns-child>
            <!-- comment -->
            <nsx:ns-child nsx:ns-attribute="nsx-attr-value">text</nsx:ns-child>
        </nsx:ns-child>
        <defns-child xmlns="default-ns">
            <def-child attr="val">text</def-child>
            <child xmlns=""/>
        </defns-child>
        <child>text</child>
    </root>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <root xmlns="namespaceURL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="namespaceURL pathToMySchema.xsd">
        <child>text</child>
        <child attribute="attr-value"/>
        <?pi-target pi-content?>
        <nsx:ns-child xmlns:nsx="ns1x">
            <no-ns-child>text</no-ns-child>
            <!-- comment -->
            <nsx:ns-child nsx:ns-attribute="nsx-attr-value">text</nsx:ns-child>
        </nsx:ns-child>
        <defns-child xmlns="default-ns">
            <def-child attr="val">text</def-child>
            <child xmlns="namespaceURL"/>
        </defns-child>
        <child>text</child>
    </root>
    
    String NS_URL = "namespaceURL";
    
    doc = builder.newDocument();
    Element root = doc.createElementNS(NS_URL, "root");
    root.setAttributeNS("http://www.w3.org/2001/XMLSchema-instance", 
        "xs:schemaLocation", NS_URL + " pathToMySchema.xsd");
    doc.appendChild(root);
    
    doc.createElementNS(NS_URL, name);
    
    <root 
        xmlns="namespaceURL"
        xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
        xs:schemaLocation="namespaceURL pathToMySchema.xsd"
        >