0

<File>これらのタグからいくつかの変数とその値を削除する必要があるタグを持つxmlファイルがあります。version="$(Version_Infralution.Common.dll)">Infralution.Common.dllすべての変数のバージョンとその値。どうすればC#でできますか?

XML ファイルの内容の一部:

 <File version="$(Version_Infralution.Common.dll)">Infralution.Common.dll</File> 
 <File version="$(Version_Infralution.Common.dll)">Infralution.Controls.dll</File>
 <File version="$(Version_Infralution.Common.dll)">Infralution.Controls.VirtualTree.dll</File>
 <File size="73728">Infralution.RichText.dll</File>
 <File version="$(Version_Interop.DSOFile.dll)">Interop.DSOFile.dll</File>
 <File version="$(Version_NLog.dll)">NLog.dll</File>

サンプル結果:

 <File>Infralution.Common.dll</File> 
 <File>Infralution.Controls.dll</File>
 <File>Infralution.Controls.VirtualTree.dll</File>
 <File size="73728">Infralution.RichText.dll</File>
 <File>Interop.DSOFile.dll</File>
 <File>NLog.dll</File>

XML ファイル構造には、タグの前に多くの子タグがあります。例:

<Products>
    <Product name="Connectors">
      <Registry>
        <Reg key="HKEY_CURRENT_USER\Software\ScanJour\iBox\Install" value_name="SettingsEditorShortcuts" value="1" platform="x64" />
      </Registry>
      <SharedProductRef name="SharedProduct for: ModelBuilder Client, iBox Search, Connectors" />
      <SharedProductRef name="SharedProduct for: ModelBuilder Client, iBox Server\iBox Utilities, iBox Server, iBox Server\ADODBC Manager, iBox Search, Connectors\Connector Manager, Connectors" />
      <SharedProductRef name="SharedProduct for: SharePoint Server Add-on\Search Control Webpart, Connectors" />
    </Product>
    <Product name="Connectors\Connector Manager">
      <FileSystem>
        <Dir name="ProgramFilesX64" value="ScanJour\iBox\Common Components\ConnectorManager\">
          <File version="$(Version_CSScriptLibrary.v2.0.dll)">CSScriptLibrary.v2.0.dll</File>
          <File version="$(Version_Infralution.Common.dll)">Infralution.Common.dll</File>
          <File version="$(Version_Infralution.Common.dll)">Infralution.Controls.dll</File>
4

2 に答える 2

1

LINQ-to-XMLを使用すると、XML を簡単に変更できます。最初にソース ドキュメントをXDocumentオブジェクトに解析します ( でファイルをロードする.Loadか、 で XML を含む文字列変数を処理できます.Parse)。

var xdoc = XDocument.Load("/path/to/filename.xml");

.Remove特定のノードをフィルター処理し、拡張メソッドを使用することで、不要なノードを削除できます (この例では、正確な値の<File>属性を持つタイプの要素をすべて削除します。他の要素を検証する場合は、複数の条件をチェーンできます。制約も同様):version$(Version_Infralution.Common.dll)

xdoc.Descendants("File")
    .Where(x =>
        x.Attribute("version") != null &&
        x.Attribute("version").Value == "$(Version_Infralution.Common.dll)")
    .Remove();

サンプル結果:

<Files>
  <File size="73728">Infralution.RichText.dll</File>
  <File version="$(Version_Interop.DSOFile.dll)">Interop.DSOFile.dll</File>
  <File version="$(Version_NLog.dll)">NLog.dll</File>
</Files>

ノードのコンテンツや特定の属性の値を変更したり、属性を完全に削除したりするなど、特定のノードを変更することもできます。この例では、バージョンが の要素versionから属性を削除します。<File>"$(Version_Infralution.Common.dll)"

foreach (var xn in xdoc.Descendants("File")) {
    if (xn.Attribute("version") != null &&
          xn.Attribute("version").Value == "$(Version_Infralution.Common.dll)") {
        xn.Attribute("version").Remove();
    }
}

サンプル結果:

<Files>
  <File>Infralution.Common.dll</File>
  <File>Infralution.Controls.dll</File>
  <File>Infralution.Controls.VirtualTree.dll</File>
  <File size="73728">Infralution.RichText.dll</File>
  <File version="$(Version_Interop.DSOFile.dll)">Interop.DSOFile.dll</File>
  <File version="$(Version_NLog.dll)">NLog.dll</File>
</Files>

最後に、次のようにして結果をファイルに保存できます.Save

xdoc.Save("/path/to/newfilename.xml");
于 2013-04-24T13:55:48.763 に答える
0

私は自分の質問に答えています(おそらく誰かがこのソリューションも必要とするでしょう)作業コード:

    String path = @"C:\iBoxProductValidator.xml";
    String pathResult = @"C:\iBoxProductValidatorResult.xml";

    XmlDocument configDoc = new XmlDocument();

    configDoc.Load(path);

    XmlNodeList projectNodes = configDoc.GetElementsByTagName("File");

    for (int i = 0; i < projectNodes.Count; i++)
    {
        if (projectNodes[i].Attributes["version"] != null)
        {
            projectNodes[i].Attributes.Remove(projectNodes[i].Attributes["version"]);
        }
    }

    configDoc.Save(pathResult);
于 2013-04-25T07:28:34.217 に答える