XmlDocument和换行符

时间:2014-11-26 19:41:12

标签: c# .net xml-parsing

我使用XmlDocument.Load()解析从嵌入式资源读取的XML文本。有些文本元素包含多行。我已经读过,XML解析器应该规范化换行符,将CR-LF对转换为单个LF字符。但我发现它在某些情况下并不存在。更奇怪的是,有时它会进行规范化,我无法弄清楚这种行为取决于什么。我们有一些单元测试取决于这种行为,它们传递一些机器而在其他机器上失败,同一台机器上的不同程序表现不同。我缺少什么?

这是一个简单的测试程序,在我的例子中总是表明CR和LF都是字面上保留的。 (但我提到的单元测试在同一台机器上传递,表明换行是标准化的)。设置PreserveWhitespace没有什么区别。

 asm = Assembly.GetExecutingAssembly();
 res = asm.GetManifestResourceStream("test.xml");
 var doc = new XmlDocument();
 var reader = new StreamReader(res);
 doc.Load(reader);
 var root = doc.DocumentElement;
 var text = root.InnerText;
 var cr = text.IndexOf('\r');
 var lf = text.IndexOf('\n');
 Console.WriteLine("CR:{0} LF:{1}", cr, lf);

1 个答案:

答案 0 :(得分:0)

如果要进行规范化,则必须将XmlReader实例传递给XmlDocument.Load函数,并确保:

asm = Assembly.GetExecutingAssembly();
res = asm.GetManifestResourceStream("test.xml");
var doc = new XmlDocument();
var reader = new StreamReader(res);
var xmlreader = XmlReader.Create(reader)
doc.Load(xmlreader);

XmlReader列出它确实在Data conformance section on MSDN中进行了规范化。

当我查找Load methods in the reference source时,XmlDocument超载的便捷Load方法似乎使用了XmlTextReader的{​​{1}}。

当我查看Normalization property defaults to false时,Load函数使用普通XmlReader代替XmlDocument。这可能表明内部代码在某些时候发生了变化,这可能解释了您在类似代码中看到的一些奇怪的行为。

MSDN上没有记录SearchResponse res1 = client.prepareSearch("my_index") .setTypes("data") .setSearchType(SearchType.QUERY_AND_FETCH) .setQuery(QueryBuilders.rangeQuery("timestamp").gte(from).lte(to)) .addAggregation(AggregationBuilders.terms("cat_agg").field("category").size(10)) .setSize(0) .execute() .actionGet(); Terms termAgg=res1.getAggregations().get("cat_agg"); for(Bucket item :termAgg.getBuckets()) { cat_number =item.getKey(); System.out.println(cat_number+" "+item.getDocCount()); } 的这种行为,这就是我在计算摘要时碰到它的原因。