0

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

提前致谢。

<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>

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

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

我需要将其反序列化为字符串“<A>aaaa<B>bbbb”

4

3 回答 3

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; }
}
于 2012-09-20T20:36:44.063 回答
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 模型的整个想法会造成麻烦,这对我来说似乎是最简单的解决方案。

于 2012-09-20T18:38:34.900 回答
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);
于 2012-09-20T19:46:52.523 回答