1

XMLファイルを作成するための私のコードは次のとおりです

public void CreateXml(string[] names, string[] values, string type)
{
        XElement xml = new XElement("Transaction",
            new XElement("TransactionType", type));
        foreach (var i in names)
        {
            foreach (var o in values)
            {
                xml.Add(new XElement(i.Replace(" ", string.Empty), o));
            }
        }
        xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}

そして、私の出力は次のようになります

<?xml version="1.0" encoding="UTF-8"?>
<Transaction> 
    <TransactionType>Void</TransactionType> 
    <Zip>1</Zip>
     <Zip>2</Zip> 
     <PNRef>1</PNRef> 
     <PNRef>2</PNRef> 
 </Transaction>

しかし、それは正しくありません。私はこのようなことをもっと期待しています

<?xml version="1.0" encoding="UTF-8"?>
<Transaction> 
    <TransactionType>Void</TransactionType> 
    <Zip>1</Zip>
     <PNRef>2</PNRef> 
 </Transaction>

値が正しいことに気付きましたが、重複しているだけです。これを修正するにはどうすればよいですか?

string[] textBoxNamesArray = flowLayoutPanelText.Controls.OfType<TextBox>()
                                  .Select(r => r.Name)
                                  .ToArray();

string[] textBoxTextsArray = flowLayoutPanelText.Controls.OfType<TextBox>()
                                  .Select(r => r.Text)
                                  .ToArray();
4

3 に答える 3

4

その場合、2 つの入れ子になったループを使用しないでください。2 つの入れ子になったループはデカルト積を作成します(つまり、すべての名前がす​​べての値とペアになっています)。

名前と値を同時に処理する単一のループを使用すると、期待どおりの出力が得られます。

.NET 4 を使用している場合は、次Zipのようにメソッドを使用できます。

xml.Add(
    names
    .Zip(values, (n,v) => new XElement(n.Name(" ", string.Empty), v))
    .ToArray()
);
于 2012-12-03T05:23:33.137 に答える
3

2 つの配列のデータをどのように構造化するかを知らずに判断するのは難しいですが、次のように推測します。

    for (int i = 0; i < names.Length; i++)
    {
        xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
    }
于 2012-12-03T05:23:02.693 に答える
2

辞書を使ってこれを試してください。

public void CreateXml(Dictionary<string, string> myNameValuePairs, string type)
{
    XElement xml = new XElement("Transaction",
        new XElement("TransactionType", type));
    foreach (var key in names)
    {
        xml.Add(new XElement(key.Replace(" ", string.Empty), myNameValuePairs[key]));
     }
    xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}

編集:上記のようにメソッドシグネチャを使用して回避策を実行します。ただし、これは、values[i]がnames[i]に対応する値である場合にのみ機能します。配列の長さと名前と値の内容について確信が持てない限り、これはお勧めしません。

public void CreateXml(string[] names, string[] values, string type)
{
    XElement xml = new XElement("Transaction",
        new XElement("TransactionType", type));
    foreach (var i = 0; i < names.length; i++)
    {
        xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
    }
    xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
于 2012-12-03T05:30:28.323 に答える