System.XML还是Regex.Replace?

时间:2010-04-19 12:16:54

标签: c# xml

我正在从Excel文件中的一组值生成大量XML文档。每个XML文档唯一更改的是值。我认为生成这些文档的最好方法是制作一个“XML骨架”(因为XML格式永远不会改变),然后插入像“&%blahNameblahTest”这样的符号,这样我就可以在每个文件上预先形成一个Regex.Replace。值。

我将把这个项目移交给另一个开发人员,我想知道是否应该通过System.XML命名空间将项目转换为每次手动生成XML文件。

我看到的唯一优势是确保XML文档有效。

当前方法比该方法更具可读性,并且因为我生成了大约1500个文档,因此速度更快。

4 个答案:

答案 0 :(得分:1)

我会坚持你现有的方法。

但是,我会添加对System.Linq.XML的引用,并在输出上执行XElement.Parse()以确保您的结果文档正确解析。 (您提到的System.Xml路由的一个优点!)

善,

答案 1 :(得分:0)

您可以使用string.Format方法

string.Format(
@"
   <Parent attribute = \"{0}\">
      <Child>{1}</Child>
   </Parent>
",
"foo",
"bar"
);

这将导致

   <Parent attribute = "foo">
      <Child>bar</Child>
   </Parent>

您可以发送到任何流。

答案 2 :(得分:0)

通过将skelleton XML解析为XDocument并以LINQ to XML查询的形式执行替换,您可以充分利用这两个方面。

也许按照

的方式编写扩展方法
public static void Replace(this XDocument haystack, String needle, String replacement)
{
    var query = haystack.Root
                        .DescendantsAndSelf()
                        .Where(xe => !xe.HasElements && xe.Value == needle);
    foreach (XElement item in query)
    {
        item.Value = replacement;
    }
}

答案 3 :(得分:0)

  

我看到的唯一优势是确保XML文档有效。

     

当前方法比该方法更具可读性,并且因为我生成了大约1500个文档,因此速度更快。

在我看来,在设计生成1500个XML文档的流程时,保证所有输出实际上都是格式良好的XML并不是一件容易的事。

假设包含您要替换的符号之一的典型元素如下所示:

<element>$symbol</element>

你可以用这种方式处理替换:

XmlDocument skeleton = new XmlDocument();
skeleton.Load(inputPath);
foreach (XmlElement elm in skeleton.SelectNodes("//*[starts-with(., '$')]"))
{
   elm.InnerText = GetValue(elm.InnerText);
}
skeleton.Save(outputPath);

您可以使用XmlReaderXmlWriter执行类似的操作,这会产生更快的代码,但不会那么紧凑。

这种方法的另一个优点是使用Regex.Replace:它只通过骨架XML两次,一次解析它,一次搜索它。如果使用正则表达式,则将为您替换的每个值从头到尾搜索骨架XML。