【问题标题】:How do I add a namespace prefix to an XML DOM object?如何向 XML DOM 对象添加命名空间前缀?
【发布时间】:2012-06-12 11:01:42
【问题描述】:

我正在尝试使用特定命名空间构建 XML 文档。我尝试生成的最终文档应该如下所示:

<m:documentObject xmlns:m="http://www.myschema.com">
    <sender>token</sender>
    <receiver>token</receiver>
    <payload>token</payload>
</m:documentObject>

这是我目前所拥有的。

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element requestElement = document.createElementNS("http://www.myschema.com", "documentObject");

document.appendChild(requestElement);

Element sender = document.createElement("sender");
requestElement.appendChild(sender);     
Text senderText = document.createTextNode("Xmlsender");
sender.appendChild(senderText); 

Element receiver = document.createElement("receiver");
requestElement.appendChild(receiver);       
Text receiverText = document.createTextNode("Xmlreceiver");
receiver.appendChild(receiverText); 

Element payload = document.createElement("payload");
requestElement.appendChild(payload);        
Text payloadText = document.createTextNode("Xmlpayload");
payload.appendChild(payloadText);   

StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);

DOMSource source = new DOMSource(requestElement);

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 
transformer.transform(source, result);

String xmlString = sw.toString();
System.out.println(xmlString)

由于某种原因,当我运行上面的模式时,没有前缀。如下图:

<?xml version="1.0" encoding="utf-8"?>
<documentObject xmlns="http://www.myschema.com">
    <sender>Xmlsender</sender>
    <receiver>Xmlreceiver</receiver>
    <payload>Xmlpayload</payload>
</documentObject>

我需要做什么才能使 XML 与第一个 XML 示例中显示的完全一样,带有命名空间前缀和带有命名空间前缀的标签?

我正在尝试创建一个 XML 字符串,该字符串将用于 Spring-WS Web 服务,该服务需要一个 JAXB 对象,该对象的格式如第一个示例所示。

【问题讨论】:

  • 请注意javax.xml.transform.Transformer 接口的许多不同实现在这方面的工作方式不同。根据我自己最近的经验,结果证明 org.apache.xalan.transformer.TransformerImpl 会产生与您所拥有的结果相似的结果。虽然使用 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl 会产生完全符合您预期的结果(但不会使用前缀)。

标签: java xml spring dom jaxb


【解决方案1】:

您可以使用setPrefix

但最好像这样创建根元素:

document.createElementNS("http://www.myschema.com", "m:documentObject");

另请注意,将null 传递给createElement 是一种强制使用空命名空间的受支持方式。但是,在您的原始示例中,这将不起作用,因为您的文档元素通过组合没有前缀的命名空间 URI 有效地强制使用默认命名空间。

【讨论】:

  • 很棒的答案;这同样适用于在 Oracle 的 NetSuite 中使用 SuiteScript——这些模块似乎公开了相同的 createElementNS(...),它们在命名空间前缀方面的工作方式或多或少相同。 “前缀”属性被记录为只读并且没有相应的 setPrefix,所以这是一个真正的帮助。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多