我使用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);
答案 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());
}
的这种行为,这就是我在计算摘要时碰到它的原因。