我目前正在用Java创建XML文档。该文件应具有以下结构:
<?xml version="1.0" ?>
<Cancelacion xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
RfcEmisor="VSI850514HX4"
Fecha="2011-11-23T17:25:06"
xmlns="http://cancelacfd.sat.gob.mx">
<Folios>
<UUID>BD6CA3B1-E565-4985-88A9-694A6DD48448</UUID>
</Folios>
</Cancelacion>
我想知道是否有一种特殊方法可以使用xmlns:xsd格式创建属性? 我目前正在声明这个属性:
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder;
docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.newDocument();
doc.setXmlVersion("1.0");
doc.setXmlStandalone(true);
Element cancelacion = doc.createElement("Cancelacion");
cancelacion.setAttribute("xmlns", "http://cancelacfd.sat.gob.mx");
cancelacion.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
cancelacion.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
cancelacion.setAttribute("RfcEmisor", rfc);
cancelacion.setAttribute("Fecha", fecha);
答案 0 :(得分:7)
解决方案我的问题是编写代码如下:
//Crear un document XML vacío
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
dbfac.setNamespaceAware(true);
DocumentBuilder docBuilder;
docBuilder = dbfac.newDocumentBuilder();
DOMImplementation domImpl = docBuilder.getDOMImplementation();
Document doc = domImpl.createDocument("http://cancelacfd.sat.gob.mx", "Cancelacion", null);
doc.setXmlVersion("1.0");
doc.setXmlStandalone(true);
Element cancelacion = doc.getDocumentElement();
cancelacion.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xsd","http://www.w3.org/2001/XMLSchema");
cancelacion.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
cancelacion.setAttribute("RfcEmisor", rfc);
cancelacion.setAttribute("Fecha", fecha);
Element folios = doc.createElement("Folios");
cancelacion.appendChild(folios);
for (int i=0; i<uuid.length; i++) {
Element u = doc.createElement("UUID");
u.setTextContent(uuid[i]);
folios.appendChild(u);
}
答案 1 :(得分:2)
为什么文档应该有你提出的结构?您正在使用前缀声明名称空间,但您的示例输出不包含这些名称空间中的任何元素。因此,这些声明是不必要的。
首先,要了解xmlns
(或xmlns:prefix
)是用于声明命名空间的保留XML伪属性。这不是正常的属性。其次,只要您首先在所需的命名空间中创建元素,文档中的命名空间声明的位置就不应该与您有关。
让序列化程序决定在何处放置命名空间声明。
在正确的命名空间中注册一个元素,如下所示:
Element cancelacion = doc.createElementNS(
"http://cancelacfd.sat.gob.mx", "Cancelacion");
doc.appendChild(cancelacion);
Element child = doc.createElementNS("http://cancelacfd.sat.gob.mx",
"SomeChild");
cancelacion.appendChild(child);
序列化时:
DOMSource domSource = new DOMSource(doc);
StreamResult streamResult = new StreamResult(System.out);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer = tf.newTransformer();
serializer.transform(domSource, streamResult);
结果:
<Cancelacion xmlns="http://cancelacfd.sat.gob.mx">
<SomeChild/>
</Cancelacion>
请注意Cancelacion
和SomeChild
以完全相同的方式创建,但只有Cancelacion
包含名称空间声明(因为声明适用于所有后代)。序列化器为我们处理了这个问题。
警告: 以下是黑客行为。我不建议使用它。它可能会让你陷入困境。你可能应该停止阅读。但是......如果你别无选择,它可能会奏效。
如果你很绝望,你可以手动拼接未使用的命名空间。 (将XML作为字符串处理几乎总是一个坏主意。)
首先,将结果保存在可以转换为OutputStream
的{{1}}中:
String
然后在那里堵塞命名空间声明,而不考虑什么是好的,正确的和正确的:
ByteArrayOutputStream out = new ByteArrayOutputStream();
DOMSource domSource = new DOMSource(doc);
StreamResult streamResult = new StreamResult(out);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer = tf.newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.transform(domSource, streamResult);
答案 2 :(得分:1)
xmlns:xsd
不是属性,而是namespace declaration。
DOM应该在需要时创建这些声明。
使用createElementNS和createAttributeNS方法将导致创建名称空间声明,但您需要了解XML namespaces。
在您的示例中,未使用绑定到xsd和xsi的命名空间,因此是多余的。但是,Cancelacion
元素位于默认命名空间中,该命名空间由您提供的XML中的xmlns="http://cancelacfd.sat.gob.mx"
声明定义。
所以你应该使用:
doc.createElementNS("http://cancelacfd.sat.gob.mx", "Cancelacion");
创建它。请注意,就文档的含义而言,名称空间前缀(或缺少名称空间前缀)是无关紧要的。
答案 3 :(得分:0)
在我的代码中,我写道:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element spectraexchage = document.createElementNS("http://www.lstelcom.com/Schema/SPECTRAexchange", "SPECTRAEXCHANGE");
spectraexchage.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
spectraexchage.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
spectraexchage.setAttribute("version", "2.4.28");
document.appendChild(spectraexchage);
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
输出:
<SPECTRAEXCHANGE xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4.28" xmlns="http://www.lstelcom.com/Schema/SPECTRAexchange">