System.XML или Regex.Replace? - PullRequest
       0

System.XML или Regex.Replace?

3 голосов
/ 19 апреля 2010

Я генерирую большое количество XML-документов из набора значений в файле Excel. Единственное, что меняется для каждого XML-документа - это значения. Я подумал, что лучший способ для генерации этих документов - создать «скелет XML» (поскольку формат XML никогда не меняется), а затем подключить такие символы, как «&% blahNameblahTest», чтобы я мог просто предварительно создать Regex.Replace для каждого значения .

Я передам этот проект другому разработчику, и мне интересно, должен ли я преобразовывать проект для генерации XML-файла вручную каждый раз через пространство имен System.XML.

Единственное преимущество, которое я вижу в этом, заключается в том, что документ XML действителен.

Текущий метод будет более читабельным, чем этот метод, и намного быстрее, поскольку я создаю около 1500 документов.

Ответы [ 4 ]

1 голос
/ 19 апреля 2010

Я бы придерживался вашего существующего метода.

Однако я бы добавил ссылку на System.Linq.XML и сделал бы XElement.Parse() в выводе, чтобы гарантировать, что ваш результирующий документ анализируется правильно. (Единственное преимущество, которое вы упомянули в маршруте System.Xml!)

Доброжелательность,

Dan

0 голосов
/ 19 апреля 2010

Единственное преимущество, которое я вижу в этом, - это то, что документ 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);

Вы могли бы сделать то же самое с XmlReader и XmlWriter, что даст код, который быстрее, хотя и не такой компактный.

Дополнительное преимущество этого подхода перед использованием Regex.Replace: он делает только два прохода через XML-файл скелета, один раз для его анализа и один раз для его поиска. Если вы используете регулярное выражение, вы будете искать скелетный XML от начала до конца один раз для каждого заменяемого значения.

0 голосов
/ 19 апреля 2010

Вы можете получить лучшее из обоих миров, проанализировав XML-код skelleton в 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;
    }
}
0 голосов
/ 19 апреля 2010

Вы можете использовать string.Format метод

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

Это приведет к

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

, который вы можете отправить в любой поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...