在org.apache.xerces.jaxp.DocumentBuilderImpl中的行末尾缺少CR

时间:2013-11-19 10:25:48

标签: java xml canonicalization

我正在使用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中吗?

1 个答案:

答案 0 :(得分:0)

XML standard州:

  

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

     

为了简化应用程序的任务,XML处理器必须表现得好像它在解析之前对输入中的外部解析实体(包括文档实体)中的所有换行符进行规范化,通过翻译两个字符的序列#xD #xA以及任何#xD后面没有#xA到单个#xA字符。

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