我正在使用这样的技术将Xml文件的目录读入XmlDocument对象。
private static void StripAttributes(string filePath)
{
Contract.Requires(filePath != null);
var xmlDocument = new XmlDocument();
var encode = Encoding.GetEncoding("ISO-8859-1");
using (var sr = new StreamReader(filePath, encode))
{
xmlDocument.Load(sr);
}
这是有效的,但是当在文本编辑器中渲染输出的Xml时,属性周围的单引号现在是双引号,并且子节点位于不同的行上。
之前的例子:
<xml>
<xml2>
<xmlField id='foo' string='bar'><xmlValue>foobar</xmlValue></xmlField>
</xml2>
</xml>
格式化后的示例:
<xml>
<xml2>
<xmlField id="foo">
<xmlValue>foobar</xmlValue>
</xmlField>
</xml2>
</xml>
为了进行比较,我需要原始格式保持不变。
关于如何保留Xml原始格式的任何想法?
答案 0 :(得分:0)
<强>空白强>
你的第一个问题是空白。在XML中,这通常是不重要的,因此默认情况下,XmlDocument
会规范化任何重要的空白,这就是您在这里看到的。
要更改此行为,请在加载XML之前设置PreserveWhitespace = true
:
var xmlDocument = new XmlDocument
{
PreserveWhitespace = true
};
<强>行情强>
您的第二个问题与引号字符有关。单或双有效,但.NET中的默认值是double。两个DOM都将在内部使用XmlWriter
重写您的XML,它使用此默认值。当然,您可以指定自己的XmlWriter
实例。
指南是使用XmlWriter.Create
工厂方法并使用XmlWriterSettings
指定任何功能,但是在这种情况下这不起作用。您必须明确创建XmlTextWriter
的实例并更改QuoteChar
:
var writer = new XmlTextWriter(fileName, encoding)
{
QuoteChar = '\''
};
using (writer)
{
xmlDocument.WriteTo(writer);
}
LINQ to XML
顺便说一下,我强烈建议查看LINQ to XML而不是旧的XmlDocument
API。要在XDocument
中获得类似的行为,您可以像这样解析和编写:
var doc = XDocument.Load(filePath, LoadOptions.PreserveWhitespace);
doc.WriteTo(writer);
如果您的代码建议删除属性,那么代码就像这样简单,将从名为string
的元素中删除名为xmlField
的所有属性:
doc.Descendants("xmlField")
.SelectMany(e => e.Attributes("string"))
.Remove();
答案 1 :(得分:0)
可能你不能!使用Microsoft.Net实现xml渲染时,渲染器始终重新格式化输出。 XmlDocument或XDocument具有任何类型的设置。在我们的一个项目(土耳其的Efatura)中,xml文件是xades签名的,不应该更改。我们已经意识到,只是在没有任何更改的情况下进行渲染和保存会改变xml文件中的某些内容并使签名无效。另外,例如,如果输入xml只有一行(没有任何空格),则解析器(all)无法解析文档。我们观察到的效果是解析器错过了一些元素,就好像它们不存在一样。
根据您的情况,我建议尝试使用其他xml实现。对于我们的情况,由于我们不需要改变某些,我们首先单独保留所有字符串,然后解析文档的副本以从中提取信息。完成后把它扔到垃圾桶里。
对于单行xml,我们使用了XmlReader但改变了匹配机制。