2016-06-29 11 views
-1

言語DataTable.Nameを追加せずに:C#保存XMLファイルをXMLファイルに

を私はDataTableのからのDataGridViewにロードされているXMLファイルを保存したいです。 .WriteXML()を使用するためには、DataTableに名前を付ける必要があることを知っています。私の問題は、これを行うと、DataTableの名前は、XMLファイル内の各要素の周りのラッパーとして使用されることです。私はこれが起こることを望んでいない。 XMLファイルの値を編集して同じレイアウトに保持したいだけです。

これは私のコードは、データテーブルとのDataGridViewに入れられている方法です。

string pathOfXML = C:\\FIlePath; 

DataTable dt = new DataTable("XML_Table");  

public void XML_Document() 
{ 
    XML_FILE = XDocument.Load(pathOfXML); 

    dt.Columns.Add("Name"); 
    dt.Columns.Add("Value"); 

    var rows = doc.Root.Descendants().Select(element => new 
    { 
    Name = element.Name, 
    Value = element.Value, 
    }); 

    rows.ToList().ForEach(i => dt.Rows.Add(i.Name, i.Value)); 

    dgv_XML.DataSource = dt; 
} 

それはDataGridViewのを移入することができますので、私はその後、)(私のFormLoadでこのメソッドを呼び出します。

私はここで、ボタンのクリックイベントとXMLの変更を保存しようとしているコードです:

void btn_Save_Click(object sender, EventArgs e) 
{  
    dt.WriteXML(pathOfXML); 

    Messagebox.Show("Save Successful!"); 
} 

XMLファイルが(それは非常に基本的です)、次のようになります。

<Root> 
    <Element> Value </Element> 
    <Element> Value </Element> 
    <Element> Value </Element> 
    <Element> Value </Element> 
    <Element> Value </Element> 
    <Element> Value </Element> 
    <Element> Value </Element> 
</Root> 

これは、私がそれを保存しようとするたびに次のようになります。

<Root> 
    <XML_Table> 
     <Name> Element Name </Name> 
     <Value> Element Value </Value> 
    </XML_Table> 
    <XML_Table> 
     <Name> Element Name </Name> 
     <Value> Element Value </Value> 
    </XML_Table> 
    <XML_Table> 
     <Name> Element Name </Name> 
     <Value> Element Value </Value> 
    </XML_Table> 
    <XML_Table> 
     <Name> Element Name </Name> 
     <Value> Element Value </Value> 
    </XML_Table> 
    <XML_Table> 
     <Name> Element Name </Name> 
     <Value> Element Value </Value> 
    </XML_Table> 
    <XML_Table> 
     <Name> Element Name </Name> 
     <Value> Element Value </Value> 
    </XML_Table> 
    <XML_Table> 
     <Name> Element Name </Name> 
     <Value> Element Value </Value> 
    </XML_Table> 
</Root> 

これは、値を編集し、それらを保存し、しかし、すべての要素の周りに "XML_Table"を置くだけで、私はちょうどその "XML_Table"が起こるのを止めたいと思っています。

+0

DataTable dtは2回定義されます。両方のメソッドの外側にあるパブリックスペースに移動すると、 'dt'の同じインスタンスが使用されます。 – jdweng

+0

@jdweng良いアイが、私はまだ同じ問題があります。 –

+0

私たちにあなたが望むXMLを教えてください。 –

答えて

0

値を保持する要素とテキストボックスを保持するダイナミックラベルを作成しました。それから私は増分 "i"を得ることができるようにforループを作成しました。私はその後、forループ内にforeachループを配置して、各要素を繰り返し処理し、その要素の値を配列が現在保持している値に置き換えることができました。

int lblpositionX = 17; 
int lblpositionY = 39; 
int increment = 0; 
string[] arr1 = {}; 

foreach (XElement Name in XDocumentName.Root.Descendants()) 
{ 
    Label lbl = new Label(); 
    lbl.Text = Name.ToString(); 
    lbl.Name = Name.ToString(); 
    lbl.Location = new Point(lblpositionX, lblpositionY); 
    lblpositionY += 25; 

    TextBox txt = new TextBox(); 
    txt.Text = Name.Value.ToString(); 
    txt.Name = "XML_Text" + increment; 
    txt.Location = new Point(txtpositionX, txtpositionY); 
    txtpositionY += 25; 

    pnl_XML.Controls.Add(lbl); 
    pnl_XML.Controls.Add(txt); 
} 

private void btn_Save_Click(object sender, EventArgs e) 
{ 
    var textboxes = pnl_XML.Controls.OfType<TextBox>().Select(Control => Control.Text); 
    arr1 = textboxes.ToArray(); 
    int textBox = textboxes.Count(); 

    for (int i = 0; i < textBox; i++) 
    { 
     foreach (XElement Name in XDocumentName.Descendants()) 
     { 
     Name.Value = arr[i]; 
     i++ 
     } 
     XDocumentName.Save(pathofXML); 
     return; 
    } 
} 
0

ホイールを改造する必要はありません。それぞれ書き込みと読み取りにはDataTable.WriteXmlDataTable.ReadXmlの方法を使用してください。

究極の目標は何ですか?

ファイルサイズを小さくする場合は、列マッピングを要素ではなく属性に設定します。また、表の短縮名も指定します。

var dt = new DataTable("dt"); // short table name 

// mapping to attribute 
dt.Columns.Add("Name").ColumnMapping = MappingType.Attribute; 
dt.Columns.Add("Value").ColumnMapping = MappingType.Attribute; 

dt.Rows.Add("name1", "value1"); 
dt.Rows.Add("name2", "value2"); 

dt.WriteXml("test.xml"); 

これにより、次の結果が得られます。

<?xml version="1.0" standalone="yes"?> 
<DocumentElement> 
    <dt Name="name1" Value="value1" /> 
    <dt Name="name2" Value="value2" /> 
</DocumentElement> 

ご覧のとおり、結果は非常にコンパクトです。そして、あなたが望むものとほぼ同じです。


さて、完全なサンプルコードを試してみてください。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     //InitializeComponent(); 
     path = "test.xml"; 

     dataGridView = new DataGridView { Parent = this, Dock = DockStyle.Top }; 
     buttonLoad = new Button { Parent = this, Top = 170, Text = "Load" }; 
     buttonSave = new Button { Parent = this, Top = 200, Text = "Save" }; 

     buttonLoad.Click += ButtonLoad_Click; 
     buttonSave.Click += ButtonSave_Click; 
    } 

    DataGridView dataGridView; 
    Button buttonSave; 
    Button buttonLoad; 

    string path; 
    DataTable dataTable; 
    DataSet dataSet; 

    private void ButtonLoad_Click(object sender, EventArgs e) 
    { 
     dataSet = new DataSet("Root"); 

     if (File.Exists(path)) 
     { 
      dataSet.ReadXml(path, XmlReadMode.InferSchema); 
      dataTable = dataSet.Tables[0]; 
     } 
     else 
     { 
      dataTable = new DataTable("dt"); 

      dataTable.Columns.Add("Name").ColumnMapping = MappingType.Attribute; 
      dataTable.Columns.Add("Value").ColumnMapping = MappingType.Attribute; 

      dataTable.Rows.Add("name1", "value1"); 
      dataTable.Rows.Add("name2", "value2"); 

      dataSet.Tables.Add(dataTable); 
     } 
     dataGridView.DataSource = dataTable; 
    } 

    private void ButtonSave_Click(object sender, EventArgs e) 
    { 
     if (dataSet != null) 
      dataSet.WriteXml(path); 
    } 
} 
+0

あなたはDataTable.ReadXmlを使用するための答えに言及しましたが、実際の回答で使用していませんでしたか?忘れましたか?私はそれを使用しようとし、私のDataGridViewに正しくロードされませんでした。 columnMappingはうまく動作し、編集したXMLを正しく配置しますが、DataTableの名前が行に追加されます。 XMLファイルを再度編集する必要がある場合は、DataGridViewに正しく読み込むことができるように、それを残しておく必要があります。保存されたファイルがDataGridViewに読み込まれると、「名前」列にはDataTable名のみが表示され、それ以外は表示されません。 –

+0

@AnthonyScheel - _left out_ - 何のため?あなたの**究極の**目標は何ですか?なぜあなたは間違ったXML形式を作成し、それから英雄的にそれを読もうとしていますか? –

+0

@AnthonyScheel - 更新を参照してください。私はサンプルコードを追加しました。 –

関連する問題