0

クラス Rule に逆シリアル化したい次の xml (以下を参照) があります。xml 入力の Parameters ノードからの 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; }
}

編集:私は十分に明確ではないと思います。パラメータという名前のノード全体を、カスタム クラスではなく文字列にシリアル化する必要があります。これを含む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

この方法を試してください:

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 に答える
0

luksan提案されているような OOP の使用を検討してください。

それ以外の場合は、サポートのために 2 つのプレースホルダー クラスを作成し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 に答える