假设您的实际XML是格式良好的,则DataSet.ReadXml()
的行为是正确的,因为您的各种元素值周围的空格是significant whitespace.如果您不需要该空格,则必须手动修复或修剪该XML.
As a workaround,如果您不能修复您的XML以不包含不适当的重要空格,您可以在阅读后使用以下扩展方法手动裁剪它:
public static class DataExtensions
{
public static DataSet TrimWhiteSpace(this DataSet set)
{
foreach (DataTable table in set.Tables)
table.TrimWhiteSpace();
return set;
}
public static DataTable TrimWhiteSpace(this DataTable table)
{
var columns = table.Columns.Cast<DataColumn>().Where(c => c.DataType == typeof(string)).ToList();
if (columns.Count < 1)
return table;
foreach (var row in table.AsEnumerable())
foreach (var col in columns)
if (row[col] is string s) // Skip DBNull values.
row[col] = s.Trim();
return table;
}
}
然后,要加载,请执行以下操作:
DataSet dataSet = new DataSet();
dataSet.ReadXml(@filePath);
dataSet.TrimWhiteSpace();
演示小提琴here.
An explanation关于为什么没有删除空格可以在in Extensible Markup Language (XML) 1.0 (Fifth Edition): 2.10 White Space Handling中找到,其中规定:
在编辑XML文档时,使用"空白"(空格、制表符和空行)来分隔标记以获得更好的可读性通常更方便.这样的空白通常不打算包含在交付的文档版本中.另一方面,在交付的版本中应该保留的"重要"空白是常见的,例如在诗歌和源代码中.
但是,重要的空格和不重要的空格到底是如何区分的呢?如果没有xml:space
属性,则不重要的空格 node 将用XmlReader.NodeType == XmlNodeType.Whitespace
标识,其定义为:
White space between markup.个
但是,191.1.1.1
值周围的空格不是空格between markup,而是空格between markup and text content.,因此它被报告为文本值的一部分.换个Angular 看:在没有任何模式信息的情况下,XmlReader
和DataSet
不知道<ip_address>
的值是IP地址,它可能是格式化的莎士比亚十四行诗,在这种情况下,需要向应用程序报告空白.[1]
因此,您的XML应该按如下方式序列化:
<?xml version="1.0"?>
<xml>
<data name="This is a name">
<Owner>Person</Owner>
<ip_address>191.1.1.1</ip_address>
<LastOndate>04/14/2026</LastOndate>
</data>
</xml>
[1]Liquid Technologies的文档页面XML Whitespace有一张漂亮的图表,显示了重要的空白和不重要的空白之间的区别.