1

我正在使用 org.apache.xerces.jaxp.DocumentBuilderImpl 在 java 中加载 xml 文档。要加载的文件是:

<?xml version="1.0" encoding="UTF-8"?>CRLF
<doc >CRLF
  <e1   />CRLF
</doc>

我以常用方式加载文档:

 DocumentBuilder builderXml = null;
 Document nodeXml = null;
 ByteArrayInputStream inputStream = new ByteArrayInputStream(xmlByte);
 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
 documentBuilderFactory.setNamespaceAware(true);
 builderXml = documentBuilderFactory.newDocumentBuilder();
 nodeXml = builderXml.parse(inputStream);

加载的文档似乎没问题,但只缺少一件事。省略了行尾的 CR。

如果我打电话给这个

nodeXml.getChildNodes().item(0).getChildNodes().item(0).getNodeValue()

我得到 "\n " 字符串。

在正常情况下不是这个问题,但结合规范化我得到了不同的结果,如我所料。有人能帮我看看 CR 在结尾处有什么问题吗?

Java SDK 1.7_25 x86

预先感谢您的帮助

弗拉多

编辑:

在.net中我可以写这个

var xDoc = new XmlDocument();
xDoc.PreserveWhitespace = true;
using (var fs = new FileStream("file.xml", FileMode.Open))
{
    xDoc.Load(fs);
}

var transform = new XmlDsigC14NTransform(false) { Algorithm = SignedXml.XmlDsigC14NTransformUrl };

transform.LoadInput(xDoc);
var output = (MemoryStream)transform.GetOutput();

File.WriteAllBytes("C:\\file1.xml", output.ToArray());

并保留空格。这在java中可能吗?

4

1 回答 1

0

XML 标准规定:

XML 解析实体通常存储在计算机文件中,为了编辑方便,这些文件被组织成行。这些行通常由字符 CARRIAGE RETURN (#xD) 和 LINE FEED (#xA) 的某种组合分隔。

为了简化应用程序的任务,XML 处理器必须表现得好像它在解析之前通过翻译两个字符序列 #xD #xA 和任何 # xD 后面没有 #xA 到单个 #xA 字符。

所以你看到的实际上是预期的行为。

于 2013-11-19T10:32:28.560 回答