如何删除 xml 文档中的独立属性声明?

Posted

技术标签:

【中文标题】如何删除 xml 文档中的独立属性声明?【英文标题】:How to remove standalone attribute declaration in xml document? 【发布时间】:2012-01-16 07:25:43 【问题描述】:

我目前正在使用 Java 创建一个 xml,然后将其转换为字符串。 xml声明如下:

DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.newDocument();
doc.setXmlVersion("1.0");

为了将文档转换为字符串,我包含以下声明:

TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
trans.setOutputProperty(OutputKeys.VERSION, "1.0");
trans.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
trans.setOutputProperty(OutputKeys.INDENT, "yes");

然后我进行转换:

StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
trans.transform(source, result);
String xmlString = sw.toString();

问题是,在 XML 声明属性中,包含了独立属性,我不希望这样,但我希望出现版本和编码属性:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

有没有可以指定的属性?

【问题讨论】:

出于好奇,为什么要摆脱standalone="no"?毕竟缺少standalone属性相当于standalone="no":“如果没有外部标记声明,独立文档声明没有意义。如果有外部标记声明但没有独立文档声明,则值假定为“否”。” w3.org/TR/REC-xml/#sec-rmd 因为我目前正在开发一个应该生成电子发票的系统。为了生成发票,我需要创建一个 xml,它应该遵循 SAT(在墨西哥)所做的规范。如果不遵守规范,发票将失效。 说明 XML 文档必须符合某种格式约定的规范,即超出 XML 信息模型内容的规范,需要后处理。 XML 序列化器通常不能满足关于序列化的任意规范。 (我指的是信息科学意义上的“任意”,而不是“随机”的意思。) 【参考方案1】:

根据我的阅读,您可以通过在创建DOMSource 之前在Document 上调用以下方法来做到这一点:

doc.setXmlStandalone(true); //before creating the DOMSource

如果你设置它false 你无法控制它是否出现。所以setXmlStandalone(true)Document。在变压器中,如果您想要输出,请使用 OutputKeys 与您需要的任何“是”或“否”。如果您在Document 上使用setXmlStandalone(false),则无论您在Transformer 中设置什么(如果设置),您的输出都将始终为standalone="no"

阅读thread in this forum

【讨论】:

在 Windows 7 上使用 Sun Java 1.6.0_35 时,我仍然在输出中得到 Standalone="no" 你也可以设置transformer的属性-OutputKeys.STANDALONE为true @JanHruby 应该设置为“是” @Pangea 它可以工作,但是当我这样做时,它不再在序言之后打印换行符了! transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "");导致序言后添加新行

以上是关于如何删除 xml 文档中的独立属性声明?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java DOM + Transformer 时省略 xml 声明中的独立属性。

如何删除word文件属性中的摘要信息

当我们有多个同名但属性不同的元素时,如何使用 Xdocument 从 xml 中删除一个元素

如何使用 boost ptree 删除 xml 属性?

如何使用 PHP 删除所有 xml 属性值?

如何使用 .NET XML API 删除 xmlns 属性