C# 保留xml属性C之间的新行#

C# 保留xml属性C之间的新行#,c#,xml,C#,Xml,我有一个由用户输入的XML,我必须向它添加一些属性,然后将更改后的XML作为字符串返回 现在的问题是,它忽略了属性之间的退格。下面是我所说的一个例子: 我得到的XML: <note day="12" month="11" year="2002" to="Tove" from="Jani" heading="Reminder"> </note> 但当使用新行分隔属性时,XmlDocument.Preserve

我有一个由用户输入的XML,我必须向它添加一些属性,然后将更改后的XML作为字符串返回

现在的问题是,它忽略了属性之间的退格。下面是我所说的一个例子:

我得到的XML:

<note day="12" 
      month="11"
      year="2002"
      to="Tove"
      from="Jani" 
      heading="Reminder">
</note>
但当使用新行分隔属性时,XmlDocument.PreserveWhitespace似乎不起作用

为了从XmlDocument创建字符串,我使用以下代码:

 using (var sw = new StringWriter())
 {
     using (var xw = XmlWriter.Create(sw, settings))
     {
        xw.WriteString(xmlDocument.InnerXml);
     }
     string stringToOutput = sw.ToString();               
 }

尝试查看settings.IndentChars

var settings = new XmlWriterSettings() 
{
    IndentChars = "\r\n"
}

任何XML解析器都不会保留属性之间的精确空格。这只是表面上的。如果您有一个依赖于正确使用空格的应用程序,那么该应用程序严重损坏,您应该修复它

我们在StackOverflow上经常看到两种问题

(a) 我们看到人们阅读XML时没有使用XML解析器,通常使用正则表达式。不可避免地,这些人只能处理传入的XML,前提是它的格式完全符合他们的预期

(b) 然后,我们看到人们试图生成XML,而XML的格式正是类别(a)中的某个人所期望的。这通常只能通过“手动格式化”XML而不是使用通用XML库来实现


这些人忽略了XML的全部要点,即使用广泛可用的库支持的标准格式进行数据交换,以降低成本。

欢迎使用Stack Overflow。请编辑您的问题,将XML内联显示为文本而不是图像。此外,您已经展示了读取XML的代码,但还没有展示如何写出XML。A会让你更容易得到帮助。谢谢你的回复。我已将XML更改为显示为文本,并添加了如何编写XML的代码。好的。首先,我建议使用
xmlDocument.Save(sw)
——您不需要获取内部XML等,这不会解决问题,但在我看来,这通常是一种更好的方法。然而,
xmlDocument.PreserveWhitespace
是关于在元素内容中保留空白,而不是在属性之间。我不确定是否有办法保留属性的精确布局:(嗯……我希望
XmlWriterSettings.NewLineOnAttributes
能在这里工作,但它似乎不起作用……感谢您提供有关保存部分的附加说明。将按照您的建议进行更改。问题是,当将XML字符串加载到XmlDocument时,所有CR和NL字符都会被存储。除了中间属性之外。(\n\r甚至没有用分隔的内联属性)我明白你想说的,但这个程序需要帮助用户构建XML。它通过向现有XML添加一些属性来帮助用户。如果他创建自己的XML,用新行分隔属性,然后我的程序完全忽略缩进和新行,这是毫无意义的。WPF就是一个很好的例子,其中用户界面是de被XAML罚款。假设用户希望使用我的程序向现有XAML添加属性。如果我的程序完全弄乱了缩进,没有多少人会高兴。我怀疑有XML解析器可以做到这一点——就像Roslyn C#编译器能够保留精确的空白一样。的用例“我希望能够在不完全更改所有格式的情况下修改文档,即使它在语义上无关紧要“在我看来,这是非常合理的。但是,我不相信内置的XML API可以处理该用例。我不知道是否有其他的.NET库可以处理该用例。XML编辑器有这个要求,并通过自己的专门解析来解决它(他们还需要理解格式不正确的输入)。对于普通应用程序的通用XML解析,它将过于复杂(您需要保留诸如单引号与双引号、十六进制与十进制字符引用、外部实体边界、属性顺序等区别。这太难了;尽管人们经常要求解决部分问题,例如保留属性顺序很好。
        XmlDocument xmlDocument= new XmlDocument();
        xmlDocument.PreserveWhitespace = true;
        xmlDocument.LoadXml(xmlContent);
 using (var sw = new StringWriter())
 {
     using (var xw = XmlWriter.Create(sw, settings))
     {
        xw.WriteString(xmlDocument.InnerXml);
     }
     string stringToOutput = sw.ToString();               
 }
var settings = new XmlWriterSettings() 
{
    IndentChars = "\r\n"
}