将XComment替换为其内容

时间:2011-03-05 08:47:27

标签: c#-4.0 linq-to-xml

在有效的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 个答案:

答案 0 :(得分:2)

您需要先在评论中解析XML,即xComment.ReplaceWith(XElement.Parse(xComment.Value))。只要注释包含单个元素节点的标记,这应该有效,就像样本中第一个注释的情况一样。在更一般的情况下(即,当评论包含多个元素的标记或其他节点的其他元素时),您需要xComment.ReplaceWith(XElement.Parse("<dummy>" + xComment.Value + "</dummy>").Nodes())