我正在使用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中吗?
答案 0 :(得分:0)
XML解析的实体通常存储在计算机文件中,为方便编辑,这些文件被组织成行。这些行通常由字符CARRIAGE RETURN(#xD)和LINE FEED(#xA)的某种组合分隔。
为了简化应用程序的任务,XML处理器必须表现得好像它在解析之前对输入中的外部解析实体(包括文档实体)中的所有换行符进行规范化,通过翻译两个字符的序列#xD #xA以及任何#xD后面没有#xA到单个#xA字符。
所以你看到的实际上是预期的行为。