【问题标题】:Setting attribute without prefix using Java DOM使用 Java DOM 设置不带前缀的属性
【发布时间】:2014-10-16 10:57:40
【问题描述】:

使用 Java DOM 我正在​​尝试为属性名称之前没有命名空间的元素设置属性。

所以,我需要的是:

<documentObject xmlns="http://www.myschema.com">
    <element1 attr1="value">foo</element1>
</documentObject>

如果我尝试将属性设置为以下element1.setAttributeNS("http://www.myschema.com", "attr1", value);,我会得到一个空的 xmlns 标记,另外还有一个带有如下前缀的 xmlns:

<element1 attr1="value" xmlns="" xmlns:ns3="http://www.myschema.com">foo</element1>

如果我尝试将属性设置为以下element1.setAttribute("xmlns:attr1", value);,我会在我的属性名称前得到一个前缀 (xmlns),如下所示:

<element1 xmlns:attr1="value">foo</element1>

至于更多信息,我创建我的元素如下:

 Element element = dom.createElementNS("http://www.myschema.com", elemName);
 element.appendChild(dom.createCDATASection("foo");
 xmlElement.appendChild(element);

【问题讨论】:

    标签: java xml dom namespaces


    【解决方案1】:

    让我们再看看你想要的输出:

    <documentObject xmlns="http://www.myschema.com">
        <element1 attr1="value">foo</element1>
    </documentObject>
    

    在本文档中,以下陈述属实:

    1. documentObjectelement1 位于 http://www.myschema.com 命名空间中。

    2. 属性attr1不在任何命名空间中。

    虽然名称不带前缀的元素将位于任何有效的默认命名空间中,但名称不带前缀的属性则不在任何命名空间中。见spec

    默认命名空间声明不直接应用于属性名称;无前缀属性的解释由它们出现的元素决定。

    所以要获得你想要的输出,你应该能够做到:

    element1.setAttribute("attr1", value);
    

    当然,这一切都取决于所需的输出是否正确。如果真的attr1 必须在命名空间中,那么您想要的输出不正确。

    【讨论】:

      【解决方案2】:

      下面的代码将产生输出

      <?xml version="1.0" encoding="UTF-8"?>
      <documentObject xmlns="http://www.myschema.com">
          <element1 attr1="value">foo</element1>
      </documentObject>
      

      Java 代码

      import java.io.File;
      import javax.xml.parsers.DocumentBuilder;
      import javax.xml.parsers.DocumentBuilderFactory;
      import javax.xml.parsers.ParserConfigurationException;
      import javax.xml.transform.Transformer;
      import javax.xml.transform.TransformerException;
      import javax.xml.transform.TransformerFactory;
      import javax.xml.transform.dom.DOMSource;
      import javax.xml.transform.stream.StreamResult;
      import org.w3c.dom.Attr;
      import org.w3c.dom.Document;
      import org.w3c.dom.Element;
      
      public class XMLTest {
      
          public static void main(String[] args) throws ParserConfigurationException, TransformerException {
      
              DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
              DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
      
              Document doc = docBuilder.newDocument();
      
              Element element = doc.createElementNS("http://www.myschema.com", "documentObject");
              doc.appendChild(element);
      
              Element element1 = doc.createElement("element1");
              element.appendChild(element1);
      
              element1.appendChild(doc.createTextNode("foo"));
              Attr attr = doc.createAttribute("attr1");
              attr.setValue("value");
              element1.setAttributeNode(attr);
      
              element.appendChild(element1);
      
              // write the content into xml file
              TransformerFactory transformerFactory = TransformerFactory.newInstance();
              Transformer transformer = transformerFactory.newTransformer();
              DOMSource source = new DOMSource(doc);
              StreamResult result = new StreamResult(new File("testfile.xml"));
              transformer.transform(source, result);
              System.out.println("File saved!");
          }
      }
      

      【讨论】:

      • 在这种情况下,我得到以下格式的结果:myschema.com">foo</element1>
      • 我添加了完整的示例。试试这个!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2014-12-09
      • 2019-04-19
      • 2012-05-22
      • 2020-10-07
      • 2013-08-14
      相关资源
      最近更新 更多