Я пытаюсь использовать Regex в C #, чтобы сопоставить раздел в XML-документе и обернуть этот раздел внутри тега.

Например, у меня есть такой раздел:

<intro>
    <p>this is the first section of content</p>
    <p> this is another</p>
</intro>

И я хочу, чтобы это выглядело так:

<intro>
   <bodyText>
      <p> this is asdf</p>
      <p> yada yada </p>
   </bodyText>
</intro>

Есть идеи?

Я подумывал сделать это с помощью класса XPath в C # или просто прочитав документ и используя Regex. Я просто не могу понять это в любом случае.

Вот одна попытка:

        StreamReader reader = new StreamReader(filePath);
        string content = reader.ReadToEnd();
        reader.Close();

        /* The regex stuff would go here */

        StreamWriter writer = new StreamWriter(filePath);
        writer.Write(content);
        writer.Close();
    }

Благодарность!

3
samandmoore 5 Июн 2010 в 00:53
5
Обязательная ссылка: stackoverflow.com/questions/1732348/…
 – 
Carl Norum
5 Июн 2010 в 00:55
Похоже, вам может понадобиться XSLT.
 – 
jball
5 Июн 2010 в 00:56
Какая версия .NET вы используете?
 – 
Mark Byers
5 Июн 2010 в 03:53
Я использую 3.5, и я использую XSLT для некоторых вещей, я мог бы использовать его для этого, я просто надеялся найти быстрое решение C #, чтобы я мог тратить больше времени на написание кода презентации в XSLT, а не на организационном коде.
 – 
samandmoore
8 Июн 2010 в 00:10

2 ответа

Лучший ответ

Я бы не рекомендовал регулярные выражения для этой задачи. Вместо этого вы можете сделать это с помощью LINQ to XML. Например, вот как можно обернуть некоторые теги внутри нового тега:

XDocument doc = XDocument.Load("input.xml");
var section = doc.Root.Elements("p");
doc.Root.ReplaceAll(new XElement("bodyText", section));
Console.WriteLine(doc.ToString()); 

Результат:

<intro>
  <bodyText>
    <p>this is the first section of content</p>
    <p> this is another</p>
  </bodyText>
</intro>

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

6
Mark Byers 5 Июн 2010 в 01:13
Хотя я согласен с этим подходом, я не думаю, что этот код действительно делает то, что хотел OP.
 – 
hemp
5 Июн 2010 в 01:02
1
@hemp: Да, я не утверждаю, что он может слепо скопировать и вставить этот код в свой проект, и все его проблемы будут решены, но, надеюсь, этого достаточно, чтобы начать работу.
 – 
Mark Byers
5 Июн 2010 в 01:05
Прочитал еще раз и сам попробовал, ошибся - ваш код делает именно то, что он просил. Извините!
 – 
hemp
5 Июн 2010 в 03:43

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

Используйте что-то вроде

XMLDocument doc = new XMLDocument();
doc.Load("Path to your xml document");

Наслаждайтесь!

1
Doug 5 Июн 2010 в 00:58