问题
是否应该在我的多行字符串文字xml的开头忽略空格?
代码
string XML = @"
<?xml version=""1.0"" encoding=""utf-8"" ?>"
using (StringReader stringReader = new StringReader(XML))
using (XmlReader xmlReader = XmlReader.Create(stringReader,
new XmlReaderSettings() { IgnoreWhitespace = true }))
{
xmlReader.MoveToContent();
// further implementation withheld
}
请注意,在上面的代码中,在XML声明之前有空格,尽管我设置了IgnoreWhiteSpace
属性,但这似乎并没有被忽略。我哪里错了?!
注意:当XML字符串没有换行符时,我有相同的行为,只有一个空格,如下所示。我知道如果我删除空格,这将会运行,我的问题是为什么财产没有处理这个?
string XML = @" <?xml version=""1.0"" encoding=""utf-8"" ?>"
答案 0 :(得分:0)
文档说明IgnoreWhitespace
属性将“获取或设置一个值,指示是否忽略无关紧要的空格。”。虽然第一个空格(以及换行符)应该是微不足道的,但制作XmlReader的人显然不这么认为。只需在使用前修剪XML,你就可以了。
如评论中所述,为清楚起见,请将您的代码更改为:
string XML = @"<?xml version=""1.0"" encoding=""utf-8"" ?>"
using (StringReader stringReader = new StringReader(XML.Trim()))
using (XmlReader xmlReader = XmlReader.Create(stringReader,
new XmlReaderSettings() { IgnoreWhitespace = true }))
{
xmlReader.MoveToContent();
// further implementation withheld
}
答案 1 :(得分:0)
根据Microsoft关于XML Declaration
的文档XML声明通常显示为XML中的第一行 文献。但是,如果使用XML声明,则不需要XML声明 必须是文档中的第一行,没有其他内容或白色 空间可以先于它。
您的代码的解析失败,因为空格位于XML声明之前。删除空格或xml声明将导致成功解析。
换句话说,如果XmlReaderSettings与XML声明的文档不一致,那将是一个错误 - 它是定义的行为。
以下是一些展示上述规则的代码。
using System;
using System.Web;
using System.Xml;
using System.Xml.Linq;
public class Program
{
public static void Main()
{
//The XML declaration is not required, however, if used it must
// be the first line in the document and no other content or
//white space can precede it.
// here, no problem because this does not have an XML declaration
string xml = @"
<xml></xml>";
XDocument doc = XDocument.Parse(xml);
Console.WriteLine(doc.Document.Declaration);
Console.WriteLine(doc.Document);
//
// problem here because this does have an XML declaration
//
xml = @"
<?xml version=""1.0"" encoding=""utf-8"" ?><xml></xml>";
try
{
doc = XDocument.Parse(xml);
Console.WriteLine(doc.Document.Declaration);
Console.WriteLine(doc.Document);
} catch(Exception e) {
Console.WriteLine(e.Message);
}
}
}