今天我从第三方后端获得了更新的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子集的。
答案 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
}
这非常难看,因为从内存消耗的角度和性能的角度来看它都是低效的。但它简单而简单。