Замените XComment его содержимым - PullRequest
0 голосов
/ 05 марта 2011

В допустимом XML-файле у меня есть следующий раздел:

<PropertyGroup>
  <WorkingDir>C:\SomeFolder\</WorkingDir>
</PropertyGroup>
<ItemGroup>
  <Files Include="$(WorkingDir)**\*.txt" />
  <!--<Files Include="$(WorkingDir)**\*.log" />-->
  <Files Include="$(WorkingDir)**\*.bat" />
  <!--<Files Include="$(WorkingDir)**\*.ps1" />
  <Files Include="$(WorkingDir)**\*.psm" />-->
  <Files Include="$(WorkingDir)**\*.cmd" />
</ItemGroup>

Я загружаю его с помощью XDocument, а затем могу получить список комментариев с помощью XComment - но предположим, что мне нужен только первый:

var xComment = (doc.Elements().DescendantNodes().OfType<XComment>().First();

Теперь я хочу заменить этот комментарий его фактическим содержанием:

xComment.ReplaceWith(xComment.Value);

Однако, вот что я получаю в качестве вывода:

<PropertyGroup>
  <WorkingDir>C:\SomeFolder\</WorkingDir>
</PropertyGroup>
<ItemGroup>
  <Files Include="$(WorkingDir)**\*.txt" />
  &lt;Files Include="$(WorkingDir)**\*.log" /&gt;
  <Files Include="$(WorkingDir)**\*.bat" />
  <!--<Files Include="$(WorkingDir)**\*.ps1" />
  <Files Include="$(WorkingDir)**\*.psm" />-->
  <Files Include="$(WorkingDir)**\*.cmd" />
</ItemGroup>

Если я вывожу содержимое xComment.Value отдельно (например, используя Console.WriteLine()), я получу <Files Include="$(WorkingDir)**\*.log" /> - так что происходит с угловыми скобками, когда я использую XNode.ReplaceWith()?Как обеспечить сохранение форматирования символов?

1 Ответ

2 голосов
/ 05 марта 2011

Ну, сначала вам нужно проанализировать XML в комментарии, т.е. xComment.ReplaceWith(XElement.Parse(xComment.Value)). Это должно работать до тех пор, пока комментарий содержит разметку узла с одним элементом, как в случае с первым комментарием в вашем образце. В более общем случае (т. Е. Когда комментарий содержит разметку для более чем одного элемента или другой для других узлов) вам потребуется xComment.ReplaceWith(XElement.Parse("<dummy>" + xComment.Value + "</dummy>").Nodes()).

...