LINQ to XML, заменить дочерние узлы, но сохранить состояние - PullRequest
1 голос
/ 25 февраля 2010

Я получил следующий XML, переданный в качестве IQueryable методу, т.е.

XML:

<body>
  <p>Some Text</p>
  <p>Some Text</p>
  <pullquote>This is pullquote</pullquote>
  <p>Some Text</p>
  <p>Some Text</p>
 <body>

Метод:

public static string CreateSection(IQueryable<XElement> section)
{
     var bodySection = from b in articleSection.Descendants("body")
                       select b;

     //Do replacement here.

     var bodyElements = bodySection.Descendants();

     StringBuilder paragraphBuilder = new StringBuilder();
     foreach (XElement paragraph in bodyElements)
     {
         paragraphBuilder.Append(paragraph.ToString());
     }

     return paragraphBuilder.ToString();
}

Я хочу заменить <pullquote> на <p> (и, возможно, добавить атрибуты).

Моя проблема не в фактической замене (XElement.ReplaceWith ()), а в том, что после замены изменения не отражают переменную bodySection, которая используется StringBuilder.

Как мне заставить это работать?

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Вы действительно не показали достаточно кода - в частности, вы не показали код замены, который пытается использовать.

Однако я подозреваю, что основная проблема в том, что bodySection - это запрос. Каждый раз, когда вы его используете, он снова будет запрашивать section - и если он извлекает информацию из базы данных, то пусть будет так. Вы можете обнаружить, что это все, что требуется, чтобы заставить его делать то, что вы хотите:

var bodySection = articleSection.Descendants("body").ToList();

Таким образом, вы получаете разделы тела в памяти, и каждый раз, когда вы используете bodySection, вы будете использовать одну и ту же коллекцию объектов, а не выполнять запросы снова.

0 голосов
/ 25 февраля 2010

Будет лучше использовать Xml Tramsformation, посмотрите здесь как это сделать и здесь для синтаксиса xsl

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