【问题标题】:How to add namespace prefix in Java DOM XML builder如何在 Java DOM XML 构建器中添加命名空间前缀
【发布时间】:2015-11-11 17:27:14
【问题描述】:

我需要在我的 xml 中设置元素的前缀。我需要按以下格式打印 xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cars xmlns:dcterms="http://purl.org/dc/terms/" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<supercars company="Ferrari">
<dcterms:carname type="formula one">Ferrari 101</dcterms:carname>
<msxsl:carname type="sports">Ferrari 202</msxsl:carname>
</supercars>
</cars>

但是,我无法在我的 XML 中添加前缀。我得到的是这个。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cars xmlns:dcterms="http://purl.org/dc/terms/" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<supercars company="Ferrari">
<carname type="formula one">Ferrari 101</carname>
<carname type="sports">Ferrari 202</carname>
</supercars>
</cars>

以下是我的 Java 代码:

public static void main(String args[]) {

      try {
         DocumentBuilderFactory dbFactory =
         DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = 
            dbFactory.newDocumentBuilder();

         Document doc = dBuilder.newDocument();

         // root element

         Element rootElement = doc.createElement("cars");
         rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:dcterms", "http://purl.org/dc/terms/");
         rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:msxsl", "urn:schemas-microsoft-com:xslt");
         doc.appendChild(rootElement);


         //  supercars element
         Element supercar = doc.createElement("supercars");

         rootElement.appendChild(supercar);

         // setting attribute to element
         Attr attr = doc.createAttribute("company");
         attr.setValue("Ferrari");
       //  supercar.setAttributeNodeNS(attr);
         supercar.setAttributeNode(attr);

         // carname element
         Element carname = doc.createElement("carname");
         Attr attrType = doc.createAttribute("type");
         attrType.setValue("formula one");
         carname.setAttributeNode(attrType);
         carname.appendChild(
         doc.createTextNode("Ferrari 101"));
         supercar.appendChild(carname);

         Element carname1 = doc.createElement("carname");
         Attr attrType1 = doc.createAttribute("type");
         attrType1.setValue("sports");
         carname1.setAttributeNode(attrType1);
         carname1.appendChild(
         doc.createTextNode("Ferrari 202"));
         supercar.appendChild(carname1);

         // write the content into xml file
         TransformerFactory transformerFactory =
         TransformerFactory.newInstance();
         Transformer transformer =
         transformerFactory.newTransformer();
         transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
         DOMSource source = new DOMSource(doc);
         StreamResult result =
         new StreamResult(new File("cars.xml"));
         transformer.transform(source, result);
         // Output to console for testing
         StreamResult consoleResult =
         new StreamResult(System.out);
         transformer.transform(source, consoleResult);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

}

我检查了这个链接Adding namespace prefix XML String using XML DOM。然而,这只是谈论 SAX 的做事方式。我需要在 DOM 中执行此操作。

我尝试了 setPrefix 方法,它抛出了 NAMESPACE_ERR

【问题讨论】:

标签: java xml dom


【解决方案1】:

首先,如果您想使用支持命名空间的 DOM,请确保设置了 dbFactory.setNamespaceAware(true);

然后使用createElementNS,例如Element carname = doc.createElementNS("http://purl.org/dc/terms/", "dcterms:carname");,在命名空间中创建元素。对另一个命名空间中的元素使用相同的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多