C# 为什么空白被添加到带有引号/名称空间的元素中?

C# 为什么空白被添加到带有引号/名称空间的元素中?,c#,xml,visual-studio,linq-to-xml,C#,Xml,Visual Studio,Linq To Xml,我的c.NET程序的一部分包含修改XML文档中元素的代码。该代码可以根据我在代码中其他地方设置的变量修改值,但问题是,在保存xml文件和更新时,所有元素都添加了空格 我在代码中根本不访问这个元素。我假设这是因为算法名称空间值的引号,因为我看不到发生这种情况的任何其他原因。我在加载时使用保留名称空间,在保存时禁用格式设置 所以问题是,为什么要添加这个额外的空格,我如何才能阻止它 XML源文件 <?xml version="1.0" encoding="UTF-8"?> <Pack

我的c.NET程序的一部分包含修改XML文档中元素的代码。该代码可以根据我在代码中其他地方设置的变量修改值,但问题是,在保存xml文件和更新时,所有元素都添加了空格

我在代码中根本不访问这个元素。我假设这是因为算法名称空间值的引号,因为我看不到发生这种情况的任何其他原因。我在加载时使用保留名称空间,在保存时禁用格式设置

所以问题是,为什么要添加这个额外的空格,我如何才能阻止它

XML源文件

<?xml version="1.0" encoding="UTF-8"?>
<PackingList xmlns="http://www.smpte-ra.org/schemas/2067-2/2016/PKL">
<Id>urn:uuid:296a656c-3610-4de1-9b08-2aa63245788d</Id>
<AnnotationText>JOT_Sample</AnnotationText>
<IssueDate>2018-02-16T20:59:42-00:00</IssueDate>
<Issuer>Generic</Issuer>
<Creator>Generic</Creator>
<AssetList>
  <Asset>
    <Id>urn:uuid:744f36b7-fc7e-4179-8b75-c71c18f98156</Id>
    <AnnotationText>Video_744f36b7-fc7e-4179-8b75-c71c18f98156.mxf</AnnotationText>
    <Hash>8HhnKnLn+Lp/Ik9i94Ml4SXAxH4=</Hash>
    <Size>14568486</Size>
    <Type>application/mxf</Type>
    <OriginalFileName>Video_744f36b7-fc7e-4179-8b75-c71c18f98156.mxf</OriginalFileName>
    <HashAlgorithm Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
  </Asset>
  <Asset>
    <Id>urn:uuid:bf5438ea-ba58-4ae0-a64a-5d23cee2ebb3</Id>
    <AnnotationText>Audio_bf5438ea-ba58-4ae0-a64a-5d23cee2ebb3.mxf</AnnotationText>
    <Hash>Wg4aEAE5Ji9e14ZyGkvfUUjBwCw=</Hash>
    <Size>4341294</Size>
    <Type>application/mxf</Type>
    <OriginalFileName>Audio_bf5438ea-ba58-4ae0-a64a-5d23cee2ebb3.mxf</OriginalFileName>
    <HashAlgorithm Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
  </Asset>
</AssetList>
</PackingList>

这很管用,虽然我的感觉不是很干净

string text = File.ReadAllText(packing);
text = text.Replace(" />", "/>");
File.WriteAllText(packing, text);
更新

这就是解决办法。谢谢你@asherber

var textToSave = pkldoc.ToString(SaveOptions.DisableFormatting).Replace(" />", "/>"); 
File.WriteAllText(packing, textToSave);

额外的空间并不重要——它根本不会改变空元素的值。我认为没有办法让序列化程序改变这些元素的格式。我听到了,但这对技术水平较低的人来说是一个艰难的推销,我需要说服他们在数百个XML上使用它。他们可以下载一个免费的文本编辑器,比较一下,看看从源代码到输出有没有意料之外的变化。即使它在技术上无关紧要,也很难出售。不管怎样,仍然有一个问题是为什么会发生。为什么可能有几个答案。一个是,它看起来更好。另一个是关于XHTML与旧浏览器兼容性的老讨论;如果这真的让您或您的客户感到困扰,您应该能够在保存之前执行pkldoc.ToString.Replace/>,/>。@asherber感谢您提供的信息和提示。不幸的是,这不起作用,因为似乎在save命令本身中添加了空格。我可以去掉除save之外的所有代码,并且仍然引入空格。我意识到这些并不影响XML的有效性,只是在比较源代码和输出时,我觉得它看起来很马虎。仅仅调用Replace并不会改变XDocument本身,但它会让您在保存字符串之前更改字符串。很抱歉,我上面的评论不够清晰。我的建议是:var textToSave=pkldoc.ToStringSaveOptions.DisableFormatting.Replace/>,/>;File.writealtextpacking,textToSave;这比写文件、读取文件、清除空间并再次写出来更有效。啊哈!是的,干净多了。非常感谢你在这方面的帮助。非常感谢@asherber我刚刚注意到,在文件输出中,头部的XML声明被剥离了。在代码中,当修改后的XML被转换为此行中的字符串时,似乎会发生这种情况:var textToSave=pkldoc.ToStringSaveOptions.disableformation.Replace/>,/>;即使我去掉这些选项并将其缩减为var textToSave=pkldoc.ToString;-它仍然没有申报。有什么想法吗?@asherber实际上,在XDocument.Load中读取文件时,这可能会被删除,而在写入时,通常会被XDocument放回文件中。有什么想法吗?声明没有被删除;它只是存储在XDocument的其他地方。尝试File.writealtextpacking,pkldoc.Declaration+textToSave;
string text = File.ReadAllText(packing);
text = text.Replace(" />", "/>");
File.WriteAllText(packing, text);
var textToSave = pkldoc.ToString(SaveOptions.DisableFormatting).Replace(" />", "/>"); 
File.WriteAllText(packing, textToSave);