如何删除 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 声明中的独立属性。