1

Webサイトのフラッシュオブジェクトに電力を供給するために、C#内で非常に特殊な形状のXMLファイルを動的に作成する必要があります。私が多くの試みで直面した問題は、ほとんどの出力が各ノードに何らかの一意の識別方法を持たせたいということですが、私はそれを望んでいません。むしろ、以下は私が求めている出力であり、現在取得できる出力ではありません。これも無効なXMLであることに注意してください。

<data>
    <Annual Enrollment>
        <row>
            <column>value1</column>
            <column>value2</column>
            <column>value3</column>
        </row>
        <row>
            <column>value1</column>
            <column>value2</column>
            <column>value3</column>
        </row>
    </Annual Enrollment>
    <Pre-College>
        <row>
            <column>value1</column>
            <column>value2</column>
            <column>value3</column>
        </row>
        <row>
            <column>value1</column>
            <column>value2</column>
            <column>value3</column>
        </row>
    </Pre-College>

....など。ノードのタイトルまたはおよびは変更できません。また、各ツリーのルートも変更できません。

私がこれまでに持っているコードはこのように見えます、私の頭の中ではそれはうまくいくはずですが、そうではありません。

  var tableResult = DashboardData.GetMetricData(1);
  // Outlinining structure
  XDocument document = new XDocument(
       new XDeclaration("1.0", "utf-8", null),
       new XElement("data",
            new XElement("AnnualEnrollment"),
            new XElement("Pre-College"),
            new XElement("Summary")
            ));
  // Now I need to append children to each of the three nodes within the root "data"
  foreach (DataRow row in tableResult.Tables[0].Rows)
  {
      document.Element("AnnualEnrollment").Add(new XElement("row"));

      foreach (var item in row.ItemArray)
      {
          var element = new XElement("column", item);


      }
  }
4

3 に答える 3

3

XmlWriterを使用して、ドキュメント構造をより細かく柔軟に制御できるようにすることを検討してください。

var docBuilder = new StringBuilder();
using (var writer = XmlWriter.Create(docBuilder))
{
    writer.WriteStartElement("data");
    writer.WriteStartElement("AnnualEnrollment");
    foreach (var row in dataTable.Rows)
    {
        writer.WriteStartElement("row");
        foreach (var item in row.ItemArray)
            writer.WriteElementString("column", item);
        writer.WriteEndElement(); // row
    }
    writer.WriteEndElement(); // Annual Enrollment
    writer.WriteEndElement(); // data
}
docBuilder.Replace("<AnnualEnrollment>", "<Annual Enrollment>");
于 2012-10-31T23:27:30.910 に答える
1

私はそれがこのように見えることを期待します:

  foreach (DataRow row in tableResult.Tables[0].Rows)
  {
     XElement aRow = new XElement("row")

     foreach (var item in row.ItemArray)
     {
          aRow.Add(new XElement("column", item))
     }

     document.Element("AnnualEnrollment").Add(aRow);

  }
于 2012-10-31T23:20:38.147 に答える
0

以下のサンプルは、最初のテーブルから行を読み取り、それらを行要素に変換し、列要素に変換された値をコンテンツとして提供します。

XDocument document = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement("data",
        new XElement("AnnualEnrollment", 
            from row in tableResult.Tables[0].AsEnumerable()
            select new XElement("row", 
                from column in tableResult.Tables[0].Columns.Cast<DataColumn>()
                select new XElement("column", row[column]))),
        new XElement("Pre-College"), // same for pre-college table
        new XElement("Summary") // and same for summary
        ));

また、DataTable変換を個別の(拡張)メソッドに抽出しました:

public static object ToXml(this DataTable dataTable)
{
    return from row in dataTable.AsEnumerable()
           select new XElement("row",
                      from column in dataTable.Columns.Cast<DataColumn>()
                      select new XElement("column", row[column]));
}

これで、Xml世代は次のようになります。

XDocument document = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement("data",
        new XElement("AnnualEnrollment", tableResult.Tables[0].ToXml()),
        new XElement("Pre-College", tableResult.Tables[1].ToXml()),
        new XElement("Summary", tableResult.Tables[2].ToXml()) 
        ));
于 2012-10-31T23:40:04.310 に答える