使用C#,如何关闭格式错误的XML标签?

提问

背景

我继承了许多XML文件,这些文件始终包含带有两个开口而不是一个开口和一个闭合的标签.我需要遍历所有这些文件并更正格式错误的XML.

这是不良XML的简化示例,每个文件中的标记完全相同:

<meals>
    <breakfast>
         Eggs and Toast
    </breakfast>
    <lunch>
         Salad and soup
    <lunch>
    <supper>
         Roast beef and potatoes
    </supper>
</meals>

请注意,<午餐>标签没有关闭.这在所有文件中都是一致的.

最好将正则表达式用于C#来解决此问题,如果是这样,我将如何准确地做到这一点?

我已经知道如何迭代文件系统并将文档读入XML或字符串对象中,因此您无需回答这一部分.

谢谢!

最佳答案

我认为,如果情况确实像您所描述的那样简单,则正则表达式会有点过大(即,它始终是相同的标记,并且总是只有一个).如果您的XML文件相对较小(千字节,而不是兆字节),则可以将整个内容加载到内存中,使用字符串操作插入丢失的斜杠,然后将其命名.这比尝试使用正则表达式要有效得多(更快).如果文件很大,则可以对其进行修改以逐行读取文件,直到找到第一个< lunch>.标签,然后寻找下一个并进行相应的修改.以下是一些入门代码:

var xml = File.ReadAllText( @"C:\Path\To\NaughtyXml.xml" );

var firstLunchIdx = xml.IndexOf( "<lunch>" );
var secondLunchIdx = xml.IndexOf( "<lunch>", firstLunchIdx+1 );

var correctedXml = xml.Substring( 0, secondLunchIdx + 1 ) + "/" +
xml.Substring( secondLunchIdx + 1 );

File.WriteAllText( @"C:\Path\To\CorrectedXml.xml", correctedXml );
评论