C#XmlSerializer和一组不同的标签名称[UWP]

时间:2017-06-30 16:50:37

标签: c# xml uwp

今天我从第三方后端获得了更新的XML内容,并且必须更改基于XmlSerializer的解析代码才能符合新字段。不幸的是,我发现有一些类似的标签,但有奇怪的行为:

<old-root>
  ...
  <contacts>
    <John>Feel happy</John>
    <Mary>Will be away for 2 hours, phone me</Mary>
    <Bob>Do not disturb. I mean it!</Bob>
    ...and so on...
  </contacts>
</root>

到目前为止,我们为&#34; old-root&#34;提供了一个解析器类。基于[XmlElement]映射,但我还没有弄清楚如何通过XML注释管理类似名称 - 值对的集合(类似[XmlArray] / [XmlArrayItem]通常这样做)。我可以通过[XmlText]注释获取值,但是如何注释any-tag? &#34;星&#34; pattern对ElementName没有影响。

P.S。我是关于.NET框架的UWP子集的。

1 个答案:

答案 0 :(得分:1)

我可以建议以下方法。使用字典表示不同的标签。 XmlIgnore无法使用字典,因此请使用[XmlRoot("old-root")] public class Root { [XmlIgnore] public Dictionary<string, string> Contacts { get; set; } } 属性进行标记并手动反序列化数据。

XElement

首先将xml读入contacts并从节点XElement创建字典。删除该节点。然后反序列化此var xs = new XmlSerializer(typeof(Root)); Root root = null; StorageFolder folder = ApplicationData.Current.LocalFolder; using (var stream = await folder.OpenStreamForReadAsync("test.xml")) { var xml = XElement.Load(stream); var contacts = xml.Element("contacts"); var dict = contacts.Elements().ToDictionary(x => x.Name.LocalName, x => x.Value); contacts.Remove(); root = (Root)xs.Deserialize(xml.CreateReader()); root.Contacts = dict; } 中的数据。最后设置以前创建的字典。

decordMessage('oppeeennnn','1234');

function decordMessage(m,k) {
    var msg = m.split('');
    var keysplit = k.split('');
    var str ='';
    var j =0
    for (var i=0;i<msg.length;){
        str += msg[i];
        if(j < keysplit.length &&i < keysplit.length && keysplit[j]){
            i = i + parseInt(keysplit[j]);
            j++;
        }
        else
          break;
    }
    console.log("after");
    console.log(str); // prints open
}

这非常难看,因为从内存消耗的角度和性能的角度来看它都是低效的。但它简单而简单。