c#deserializate xml嵌入节点到类属性

时间:2017-09-19 13:09:43

标签: c# xml deserialization

我有部分xml文档

<Tender SubTenderType="BC" TenderType="Check">
   <TenderTotal>
      <Amount>10.00</Amount>
   </TenderTotal>
</Tender>

我需要把它转换成课程。

public class Tender
{
    public string SubTenderType { get; set; } 
    public string TenderType { get; set; }
    public decimal Amount { get; set; }
}

我已经写过的和这项工作。但我可以将xml反序列化为类,如上所述?

[Serializable]
public class Tender
{
    [XmlAttribute("SubTenderType")]
    public string SubTenderType { get; set; }       

    [XmlAttribute("TenderType")]
    public string TenderType { get; set; }      

    [XmlElement("TenderTotal")]
    public TenderTotal TenderTotal { get; set; }
}

[Serializable]
public class TenderTotal
{
    [XmlElement("Amount")]
    public decimal Amount { get; set; }
}

3 个答案:

答案 0 :(得分:0)

您可以将xml反序列化为第一个Type&#34; Tender&#34;然后使用autoMapper来映射你的类型(创建不同类型的新对象)

创建地图:

config.CreateMap<TenderFirst, TenderSecond>().ForMember(x => x.TenderTotal.Amount, y => y.Amount ())

答案 1 :(得分:0)

您可以通过实施IXmlSerializable使用xml自定义序列化来实现。但是,对于自定义序列化,您将受到性能损失 您可以查看这篇文章Custom XML Serialization

答案 2 :(得分:0)

拥有以下没有public class Tender { public string SubTenderType { get; set; } public string TenderType { get; set; } public decimal Amount { get; set; } } 的课程:

XmlAttributeOverrides

您可以使用var attrSTT = new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("SubTenderType") }; var attrTT = new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("TenderType") }; var overrides = new XmlAttributeOverrides(); overrides.Add(typeof(Tender), nameof(Tender.SubTenderType), attrSTT); overrides.Add(typeof(Tender), nameof(Tender.TenderType), attrTT); var xs = new XmlSerializer(typeof(Tender), overrides); 类来覆盖序列化程序的行为,使得它不会使用元素来执行属性。

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres510@localhost/height_collector'
db = SQLAlchemy(app)


class Data(db.Model):
    __tablename__ = "data"
    id = db.Column(db.Integer, primary_key=True)
    email_ = db.Column(db.String(120), unique=True)
    height_ = db.Column(db.Integer)

    def __init__(self, email_, height_):
        self.email_ = email_
        self.heigth_ = height_


@app.route("/")
def index():
    return render_template("index.html")


@app.route("/success", methods=['post'])
def success():
    if request.method == 'POST':
        email = request.form["email_name"]
        height = request.form["height_name"]
        print(email, height)
        return render_template("success.html")


if __name__ == '__main__':
    app.debug = True
    app.run()

但是,这样就不可能添加新项目或将一个元素包装在另一个元素中。

因此,您必须执行自定义序列化,或将一种类型映射到另一种类型,或编写自定义xml读取器/写入器,或手动执行读/写(例如,使用linq2xml)。有很多方法......