使用.Net如何反序列化以下xml?

时间:2012-09-20 17:40:20

标签: c# .net xml-serialization

我有以下xml(见下文)我想要反序列化到类Rule。我还没有找到xml属性的神奇组合,它允许我将xml内容从xml输入中的Parameters节点存储为文本。 我需要一个具有属性Name = "Rule1"和属性Parameters = "<User>Tommy</User><Database>local</Database>"

的Rule类型的对象

提前致谢。

<Rule>
  <Name>Rule1</Name>
  <Parameters>
    <User>Tommy</User>
    <Database>local</Database>
  </Parameters>
</Rule>

class Rule
{
  [XmlElement("Name")]
  public string Name { get; set; }
  [XmlElement("Parameters")]
  [XmlText(typeof(string))]
  public string Parameters { get; set; }
}
编辑:我认为我不够清楚。我需要将名为Parameters的整个节点序列化为字符串而不是自定义类。例如,如果处理了包含此

的xml文档
  <Parameters>
    <X>xxxx</X>
    <Y>yyyy</Y>
  </Parameters>

我需要将其反序列化为字符串“&lt; X&gt; xxxx&lt; Y&gt; yyyy” 如果不同的xml文档包含此

  <Parameters>
    <A>aaaa</A>
    <B>bbbb</B>
  </Parameters>

我需要将其反序列化为字符串“&lt; A&gt; aaaa&lt; B&gt; bbbb”

3 个答案:

答案 0 :(得分:2)

够简单吗?

XElement xDoc = XElement.Parse(xml); //or XElement.Load(...)
Rule rule = new Rule()
{
    Name = (string)xDoc.Element("Name"),
    Parameters = String.Join("",xDoc.Element("Parameters").Elements())
};

-

class Rule
{
    public string Name { get; set; }
    public string Parameters { get; set; }
}

答案 1 :(得分:0)

请考虑使用OOP方式,例如luksan建议。

否则,我会为XmlSerializer支持组成两个占位符类,然后将对象转换为字符串,如

class Rule
{     
  public string Name { get; set; }    
  public string Parameters { get; set; }
}

class XmlRule
{
  [XmlElement("Name")]
  public string Name { get; set; }
  [XmlElement("Parameters")]
  public Parameters Parameters { get; set; }
}

class XmlParameters
{
   [XmlElement("User")]
   public string User { get; set; }
   [XmlElement("Database")]
   public string Database { get; set; }
}

public Rule CreateRule(string xml)
{
    XmlRule xmlRule = Deserialize(xml); // deserialize as you would do usually

    Rule result = new Rule
    {
        Name = xmlRule.Name,
        Parameters = CreateParametersXml(xmlRule.Parameters)
    };

    return result;
}

private string CreateParametersXml(XmlParameters parameters)
{
    return string.Format("<User>{0}</User><Database>{1}</Database>",
                         parameters.User,
                         parameters.Database);
}

也许不是最好的解决方案,因为"<User>{0}</User><Database>{1}</Database>"的东西是硬编码的,什么不是那么好。但是,由于我认为使用非OOP模型的整个想法会带来麻烦,这对我来说似乎是最简单的解决方案。

答案 2 :(得分:0)

试试这个方法:

public static string DeserializeToString(object obj)
        {
            var serializer = new XmlSerializer(obj.GetType());
            var ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            var ms = new MemoryStream();
            var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = new UnicodeEncoding(false, false) };
            var writer = XmlWriter.Create(ms, settings);
            serializer.Serialize(writer, obj, ns);

            return Encoding.Unicode.GetString(ms.ToArray());

        }

它将获取一个对象并将其转换为字符串,省略名称空间和XML声明。

使用像:

var rule = new Rule();
rule.Name = "name";
rule.Parameters = new Parameters();
rule.Parameters.User = "username";
rule.Parameters.Database = "database";

var stringResults = DeserializeToString(rule);
相关问题