如何通过DOM在xml文档中插入schemalocation
我使用JAXP创建了一个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
<?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"
>