如何使用声明的命名空间创建XML?

时间:2016-01-18 19:41:46

标签: java xml namespaces

我正在使用java创建一个xml请求。 我是使用java创建xmls的新手。

这是代码:

Document doc = docBuilder.newDocument();
            Element rootElement = doc.createElement("UserRequest");
            rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:ns0", "https://com.user.req");
            rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
            doc.appendChild(rootElement);

            // user element
            Element user = doc.createElement("User");
            rootElement.appendChild(user);

            // userAttributes element
            Element userAttr = doc.createElement("UserAttributes");
            rootElement.appendChild(userAttr);


            // name elements
            Element name = doc.createElement("Name");
            name.appendChild(doc.createTextNode("hello"));
            userAttr.appendChild(name);
            // value elements
            Element value = doc.createElement("Value");
            name.appendChild(doc.createTextNode("dude"));
            userAttr.appendChild(value);

预期输出:

<?xml version="1.0" encoding="UTF-8"?>
<UserRequest 
xmlns:ns0="https://com.user.req" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:type="ns0:UserRequest">
  <User/>
  <UserAttributes>
    <Name>hello</Name>
    <Value>dude</Value>
  </UserAttributes>
</UserRequest>

生成输出:

<?xml version="1.0" encoding="UTF-8"?>
<UserRequest 
xmlns:ns0="https://com.user.req" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

  <User/>
  <UserAttributes>
    <Name>hello</Name>
    <Value>dude</Value>
  </UserAttributes>
</UserRequest>

如何获取正确的命名空间(如预期部分所示)。

1 个答案:

答案 0 :(得分:0)

生成的输出中的命名空间没有任何问题。然而,这是一个意外......你正在使用setAttributeNS()做一些不适合的事情。

阅读XML名称空间声明和名称空间前缀。这比逐点解释为什么你没有达到预期的要容易得多。例如,xmlns不是名称空间前缀,xsi:type不是名称空间。

不要尝试创建所需的名称空间声明,就像它们是普通属性一样,删除这两行

rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/",
        "xmlns:ns0", "https://com.user.req");
rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/",
        "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");

而是使用

rootElement.setAttributeNS("http://www.w3.org/2001/XMLSchema-instance",
        "xsi:type", "ns0:UserRequest");

除了ns0命名空间前缀声明之外,这应该可以为您提供大部分预期输出。它不会生成,因为您没有在任何元素或属性上使用ns0。你的意思是

<ns0:UserRequest ...

在您的预期输出中?