【问题标题】:How to set prefix for the attribute in xml using java如何使用java为xml中的属性设置前缀
【发布时间】:2018-06-20 12:13:33
【问题描述】:

我喜欢在使用Java 创建XML 文件时为属性设置前缀。 我需要的结果是

<entry gd:etag="*">
    <id>Text</id>
</entry>

但我得到了

<entry etag="*">
    <id>Text</id>
</entry>

我写的代码是

DocumentBuilderFactory docBuildFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuildFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element entry = doc.createElement("entry");
entry.setAttribute("etag","*");
doc.appendChild(entry);
Element id = doc.createElement("id");
id.setTextContent("Text");
entry.appendChild(id);
.....

我不知道如何为属性设置前缀。有人可以建议我怎么做吗?

【问题讨论】:

  • 您可以使用 JAXB。用于 XML 绑定的 Java 架构 (JAXB) 是一个有助于绑定 XML 模式和 Java 表示的库。 JAXB 为您提供了一种将 Java 对象编组为 XML 的机制,反之亦然 - 将 XML 解组为 Java 对象。
  • 该前缀的命名空间是否设置在任何地方? &lt;entry/&gt;是根节点吗?
  • @DavidConrad 是的。 是根节点。该前缀集没有命名空间。

标签: java xml xml-parsing domparser


【解决方案1】:

您需要将DocumentBuilderFactory 设置为可识别命名空间,并且需要为该前缀设置命名空间并将setAttributeNS 用于具有XML 命名空间的属性。

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
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.Document;
import org.w3c.dom.Element;

public class Entry {
    public static void main(String[] args)
            throws IOException, ParserConfigurationException, TransformerException {
        String ns = "http://schemas.google.com/g/2005"; // just a guess
        DocumentBuilderFactory docBuildFactory = DocumentBuilderFactory.newInstance();
        docBuildFactory.setNamespaceAware(true);
        DocumentBuilder docBuilder = docBuildFactory.newDocumentBuilder();
        Document doc = docBuilder.newDocument();
        Element entry = doc.createElement("entry");
        entry.setAttributeNS(ns, "gd:etag", "*");
        doc.appendChild(entry);
        Element id = doc.createElement("id");
        id.setTextContent("Text");
        entry.appendChild(id);
        printDocument(doc, System.out);
    }

    public static void printDocument(Document doc, OutputStream out)
            throws IOException, TransformerException {
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

        transformer.transform(new DOMSource(doc),
                new StreamResult(new OutputStreamWriter(out, "UTF-8")));
    }
}

输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<entry xmlns:gd="http://schemas.google.com/g/2005" gd:etag="*">
    <id>Text</id>
</entry>

将命名空间URN替换为正确的;我只是根据谷歌搜索 gd:etag 前缀猜到的,它带来了一些 Google Data API 和 Google Contacts API 的东西。

【讨论】:

  • 没关系。但我不需要 XML 文件中的命名空间。这是否可以在不使用命名空间的情况下将前缀设置为属性?
  • @Santhosh 可能,但命名空间约束无效。这将破坏工具链的其余部分。换句话说,是的,您确实需要 XML 文件中的命名空间。你只是不知道你做到了。
  • 如果没有相应的 xmlns 声明,XML 库不会生成带有前缀的元素或属性,因为这不是有效的 XML。如果你自己生成它,比如说,简单地通过连接字符串,那么无论你发送它到什么地方都可能会阻塞它。
  • @DavidConrad 谢谢。你能回答这个问题吗?stackoverflow.com/questions/50932768/…
【解决方案2】:

SimpleXml 可以做到:

final SimpleXml simple = new SimpleXml();
final Element element =
    element("entry").attribute("gd:etag", "*")
        .child(element("id").text("Text"));
System.out.println(simple.domToXml(element));

将输出:

<entry gd:etag="*"><id>Text</id></entry>

来自 Maven 中心:

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>1.4.0</version>
</dependency>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2023-03-05
    • 2022-12-07
    相关资源
    最近更新 更多