3

私はこのようなxmlを持っています:

    <data>    
  <audit_values>
    <audit_value>
      <channel>2</channel>
      <week>
        <mo_th>6,501698000000</mo_th>
        <fr>8,414278000000</fr>
        <sa>9,292674000000</sa>
        <sun>8,551982000000</sun>
        <holid>7,164605000000</holid>
      </week>
    </audit_value>
    <audit_value>
      <channel>1</channel>
      <week>
        <mo_th>6,501698000000</mo_th>
        <fr>8,414278000000</fr>
        <sa>9,292674000000</sa>
        <sun>8,551982000000</sun>
        <holid>7,164605000000</holid>
      </week>
    </audit_value>
  </audit_values>
</data>

そして、それをクラスに逆シリアル化する必要があります。しかし問題は、その週が将来変更されることです(より多くの要素が含まれ、それらの名前はわかりません)

データ:

[XmlRoot("data")]
public class Data
{
    [XmlArray("audit_values")]
    [XmlArrayItem("audit_value", IsNullable = true)]
    public AuditValue[] AuditValues { get; set; }
}

監査値:

[XmlRoot("audit_value")]
public class AuditValue
{
    [XmlElement("week", typeof(TVR))]
    public Week Week;
}

週:

    [XmlRoot("week")]
public class Week : IXmlSerializable
{
    public Dictionary<string, double> Values = new Dictionary<string, double>();

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        reader.Read();
        var sub = reader.ReadSubtree();
        do
        {
            if (sub.NodeType == XmlNodeType.Element)
            {
                string name = sub.Name;
                string val = sub.ReadElementContentAsString();
                Values.Add(name, Convert.ToDouble(val));
            }
        } while (sub.Read());
    }

    public void WriteXml(XmlWriter writer)
    {

    }
}

しかし、デシリアライゼーションの後、ディクショナリの値に 1 つだけ記録された要素が 1 つだけあります。私が間違っていることは何ですか?

GitHub: https://github.com/olegletynain/XmlTest/tree/master/XmlTestRead

4

4 に答える 4

2

コメント セクションの @Matthew Whited のアイデアに基づいて ReadXml メソッドを微調整しました。次のメソッドがその役割を果たします。

public void ReadXml(XmlReader reader)
{
    Values = XElement.Parse(reader.ReadOuterXml())
        .Elements()
        .ToDictionary(k => k.Name.ToString(), v => double.Parse(v.Value));
}

補足として、すべてのクラスではなく、実際のルート要素に XmlRoot のみが必要なので、AuditValue と Week から削除しました。また、TVRが何であるかわかりません。「typeof(TVR)」でコンパイルされなかったので、それも削除しました。

完全を期すために、ここに私のバージョンのクラスを示します。

[XmlRoot("data")]
public class Data
{
    [XmlArray("audit_values")]
    [XmlArrayItem("audit_value", IsNullable = true)]
    public AuditValue[] AuditValues { get; set; }
}

public class AuditValue
{
    [XmlElement("week")]
    public Week Week;
}

public class Week : IXmlSerializable
{
    public Dictionary<string, double> Values = new Dictionary<string, double>();

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        Values = XElement.Parse(reader.ReadOuterXml())
            .Elements()
            .ToDictionary(k => k.Name.ToString(), v => double.Parse(v.Value));
    }

    public void WriteXml(XmlWriter writer)
    {

    }
}
于 2015-10-15T21:56:03.437 に答える
0

これを試して。XmlElement は、あなたが持っていないタグの層を排除します。値の末尾に余分な「s」があります。

From 
    [XmlArray("audit_values")]
    [XmlArrayItem("audit_value", IsNullable = true)]
    public AuditValue[] AuditValues { get; set; }
​To
    [XmlElement("audit_value")]
    public AuditValue[] AuditValues { get; set; }
于 2015-10-15T17:01:28.827 に答える