我的目标是将一个XML文件读入DataSet,然后放入DataGridView.所有这些步骤都已完成,但是datet.xml并没有修剪空格.这会在单元格中留下一串缩进和新的行.

有问题的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>

大部分数据都被省略了,但这就是它的要点.如果XML文件中的数据看起来编写或解释得很糟糕,那是因为出于隐私考虑,我不得不删除数据.

有问题的代码如下:

DataSet dataSet = new DataSet();
dataSet.ReadXml(@filePath);
dataGridView1.DataSource = dataSet.Tables[0];

预期的结果是,加载的XML元素(如IP地址和最后日期)没有空格,但它并没有这样做.除了编写一个完整的函数来使用ReadXml并更正确地读取所有这些内容之外,有没有一个选项可以让DataSet.ReadXml()消除空格?

推荐答案

假设您的实际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 看:在没有任何模式信息的情况下,XmlReaderDataSet不知道<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有一张漂亮的图表,显示了重要的空白和不重要的空白之间的区别.

Csharp相关问答推荐

具有多个应用程序服务器的Azure Signal

O(N)测试失败

Monty Hall游戏节目模拟给我50/50的结果

哪个nuget包含SecurityStampValidatorOptions

实体核心框架--HasColumnType和HasPrecision有什么不同?

C#DateTime.ToString在ubuntu和centos中返回不同的结果

可为空的泛型属性

从应用程序图API调用访问所有者字段

用C#调用由缓冲区指针参数组成的C API

将现有字段映射到EFCore中的复杂类型

我如何让我的秒表保持运行场景而不重置

如何在Cosmos SDK中控制超时、重试和重试之间的延迟?

.NET并发词典交换值

Regex字母数字校验

将操作从编辑页重定向到带参数的索引页

数据库.Migrate在对接容器重启时失败

用MongoDB c#驱动程序删除和返回嵌套数组中的文档

将字符串类型日期输入(yyyy-mm-ddthh:mm:ss)转换为MM/dd/yyyy格式

如何使用.NET 8.0中新的CompositeFormat类?

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序