1

同じ夜の私の2番目の投稿、お詫びします!

さまざまなソフトウェアエントリに関するいくつかの情報を含むXMLファイルがあります(以下のスニペットを参照)。

<software>
    <software_entry
    name="Adobe Acrobat X Standard"
    path="Applications\Acrobat\Acrobat X Standard\AcroStan.msi"
    type="msi"
    switches="/qn ALLUSERS=1"
    />
    <software_entry
    name="Adobe Acrobat X Professional"
    path="Applications\Acrobat\Acrobat X Pro\AcroPro.msi"
    type="msi"
    switches="/qn ALLUSERS=1"
    />
</software>

LINQtoXMLを使用してXMLファイルをロードしています。私のアプリケーションには2つのリストボックスがあり、最初のリストボックス(listBox1)にはこのXMLファイルの各エントリの名前が入力されています。その後、ユーザーはこれらのエントリを1つのリストボックスから別のリストボックス(listBox2)に移動できます。

listBox2の各エントリを反復処理し、XMLファイルで一致するエントリを見つけて、そのエントリの他のすべての属性を取得するメソッドを作成しようとしています。たとえば、ユーザーがAdobe AcrobatXProfessionalを2番目のリストボックスに追加しました。このメソッドは、XMLファイルを調べて、リストにあるものと一致する属性「name」を持つエントリを見つけ、他のデータ(パス、タイプ、スイッチ)を書き込むか、文字列の値として設定する必要があります。これまでのところ、多くの調整を行った後、私はほとんど達成していません。私はなんとか本当に文字化けした出力を得ることができました。

これまでの私のコードは次のとおりです。

private void writeBatchFile()
{
    // Get temp folder location
    string tempPath = Path.GetTempPath();

    // Create batch file
    using (StreamWriter writer = File.CreateText(tempPath + @"\swInstaller.cmd"))
    {
        // Loop through entries in listBox2
        foreach (string item in listBox2.Items)
        {
            var dataFromXML = from data in document.Descendants("software_entry")
                               where data.Element("name").Value == item
                               select new
                               {
                                   fileName = (string) data.Element("name"),
                                   filePath = (string) data.Element("path"),
                                   fileType = (string) data.Element("type"),
                                   fileSwitches = (string) data.Element("switches")
                               };

            // Write to batch file
            writer.WriteLine(fileName + filePath + fileType + fileSwitches);
        }
    }
}

コードには、listBox2のテキスト値のforeachループがあります。次に、その値がXMLの「名前」値と等しい場所を見つけようとしています。その場合、その値の他の属性をそれらの文字列に設定します(パスの場合はfilePath、タイプの場合はfileTypeなど)。最後に、これらの文字列をテキストファイルに書き込もうとしています。この特定の試みで、私が得ているのは5つの空白行だけです。誰かが私が間違っていることについて正しい方向に私を向けることができますか?

どうもありがとう。

4

1 に答える 1

2

要素ではなく、XML属性を読み取ろうとしています。代わりにAttributeメソッドを使用してください。

var dataFromXML = Enumerable.Single
(
    from data in document.Descendants("software_entry")
    where data.Attribute("name").Value == item
    select new
    {
        fileName = data.Attribute("name").Value,
        filePath = data.Attribute("path").Value,
        fileType = data.Attribute("type").Value,
        fileSwitches = data.Attribute("switches").Value
    }
);

writer.WriteLine(dataFromXML.fileName);

また、次の追加の変更を行う必要があります。

  • Enumerable.Single()を使用して、指定された名前に一致する要素が1つだけであることを示します。それ以外の場合dataFromXMLは、いくつかの要素が含まれている可能性があり、それらにアクセスするにはループまたはインデックスを使用する必要があります。
  • fileName変数のメンバーとして、およびその他の変数にアクセスする必要がありdataFromXMLます。独自のローカル変数がないため、前述のエラーメッセージが表示されます。
  • stringXML属性から読み取られた値はデフォルトですでに文字列であるため、にキャストする必要はありません。
于 2013-02-15T23:26:08.913 に答える