1

次のクラスのオブジェクトがあります。

public class Root
{
    [XmlElement]
    public BOMItems[] Row { get; set; }
}
public class BOMItems
{
    [XmlElement("ITEMNO")]
    public string ITEMNO { get; set; }
    [XmlElement("USED")]
    public string USED { get; set; }
    [XmlElement("PARTSOURCE")]
    public string PARTSOURCE { get; set; }
    [XmlElement("QTY")]
    public string QTY { get; set; }
}

私はXDocumentこの方法でそれをシリアル化しようとしています:

public XDocument TransformClassToXMLBOM(Root rt)
{
    var serializer = new XmlSerializer(typeof(Root));
    var sww = new StringWriter();
    var settings = new XmlWriterSettings();
    settings.ConformanceLevel = ConformanceLevel.Auto;
    var writer = XmlWriter.Create(sww, settings);

    serializer.Serialize(writer, rt);

    var doc = new XDocument( 
                    new XElement("Row",
                        new XElement("ITEMNO"),
                        new XElement("USED"),
                        new XElement("PARTSOURCE"),
                        new XElement("QTY")));                                           
    doc.Save(writer);
    return doc;
}

このように前に追加の要素を挿入してみましたnew XElement("Row",:

var doc = new XDocument( 
               new XElement("Root",
                    new XElement("Row",...

この行で常に以下のエラーが発生しますdoc.Save(writer);

状態 EndRootElement のトークン StartDocument は、無効な XML ドキュメントになります。XML フラグメントを作成する場合は、ConformanceLevel 設定が ConformanceLevel.Fragment または ConformanceLevel.Auto に設定されていることを確認してください。

最初は、XElement がないか、スペルが間違っているのではないかと思いましたが、間違いを見つけることができません。結果を確認するために値を調べる方法がわからないwriterため、これに関する解決策を見つける方法がわかりません。

私は次のようなもので終わりたいと思います:

<Root>
  <Row>
    <ITEMNO>1</ITEMNO>
    <USED>Y</USED>
    <PARTSOURCE>BUY</PARTSOURCE>
    <QTY>10</QTY>
  </Row>
</Root>

問題の原因を見つけるにはどうすればよいですか? 希望する結果を達成するための正しい方法は何ですか?

4

1 に答える 1

3

Xml Serializable Generic Dictionary http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspxを確認し てください。あなたのケースでもほぼ同じことができます。

Upd次に、このような標準シリアライゼーションを使用してクラスをシリアライズできます

    public static string SerializeObjectToXml<T>(T obj)
    {
        MemoryStream memoryStream = new MemoryStream();
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

        xmlSerializer.Serialize(xmlTextWriter, obj);
        memoryStream = (MemoryStream)xmlTextWriter.BaseStream;

        string xmlString = ByteArrayToStringUtf8(memoryStream.ToArray());

        xmlTextWriter.Close();
        memoryStream.Close();
        memoryStream.Dispose();

        return xmlString;
    }

upd2

    public static string ByteArrayToStringUtf8(byte[] value)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        return encoding.GetString(value);
    }

upd3

より明確な方法:

[Serializable]
public class Root
{
    [XmlElement("ITEMS")]
    public BOMItem[] Row { get; set; }
}

[Serializable]
public class BOMItem
{
    [XmlElement("ITEMNO")]
    public string ITEMNO { get; set; }
    [XmlElement("USED")]
    public string USED { get; set; }
    [XmlElement("PARTSOURCE")]
    public string PARTSOURCE { get; set; }
    [XmlElement("QTY")]
    public string QTY { get; set; }
}

したがって、次のようにxmlを取得できます。

        Root r1 = new Root();
        r1.Row = new BOMItem[2];
        r1.Row[0] = new BOMItem {ITEMNO = "1", PARTSOURCE = "11", QTY = "111", USED = "1111"};
        r1.Row[1] = new BOMItem { ITEMNO = "2", PARTSOURCE = "22", QTY = "222", USED = "2222" };
        MessageBox.Show(String.Format("Serialization result: {0}", SerializeObjectToXml(r1)));
于 2013-07-03T11:15:31.393 に答える