gpt4 book ai didi

JavaScript 等效于 .NET XML 反序列化

转载 作者:行者123 更新时间:2023-11-29 19:35:20 24 4
gpt4 key购买 nike

我正在寻找一个 JavaScript 库,它可以以类似于 .NET 的方式将 XML(字符串或 DOM)反序列化/解码为 JavaScript 类 XmlSerializer's Deserialize方法。

我正在寻找的功能:

  1. 类被定义为 JavaScript 构造函数。
  2. 节点和类/属性之间的映射是可配置的。
  3. 反序列化结果由这些类的实例组成。

例如,下面的 XML:

<root textAttribute='text1' numberAttribute='1' attributeToIgnore1='ignored1' attributeToIgnore2='ignored2'>
<children>
<child>text2</child>
<child>text3</child>
</children>
<childToIgnore>ignored3</childToIgnore>
</root>

与类似的 JavaScript 定义一起使用:

function RootClass() {
this.stringProperty = "";
this.integerProperty = 0;
this.collectionProperty = [];
}

function ChildClass() {
this.stringProperty = "";
}

应该生成类似于以下的 JavaScript 对象:

var result = new RootClass();
result.textProperty = "text1";
result.integerProperty = 1;
result.collectionProperty = [];
result.collectionProperty[0] = new ChildClass();
result.collectionProperty[0].textProperty = "text2";
result.collectionProperty[1] = new ChildClass();
result.collectionProperty[1].textProperty = "text3;

执行相同操作的 .NET (C#) 代码示例类似于(请参阅 this .NET Fiddle for a working example):

public class Program
{
public static void Main()
{
var result = Serializer.Deserialize();

Console.WriteLine("text: {0}", result.StringProperty);
Console.WriteLine("number: {0}", result.IntegerProperty);
Console.WriteLine("enum: {0}", result.EnumProperty);
Console.WriteLine("child[0].Value: {0}", result.CollectionProperty[0].Value);
Console.WriteLine("other@[0]: {0}", result.OtherAttributes[0].InnerText);
Console.WriteLine("other*[0]: {0}", result.OtherElements[0].InnerText);
}
}

public static class Serializer
{
public static RootClass Deserialize()
{
var type = typeof (RootClass);

var serializer = new XmlSerializer(type);

var xmlString = @"
<root textAttribute='text1' numberAttribute='1' enumAttribute='item1' attributeToIgnore1='ignored1' attributeToIgnore2='ignored2'>
<children>
<child>text2</child>
<child>text3</child>
</children>
<childToIgnore>ignored3</childToIgnore>
</root>";

using (var stringReader = new StringReader(xmlString))
{
return serializer.Deserialize(stringReader) as RootClass;
}
}
}

[XmlRoot("root")]
public class RootClass
{
[XmlAttribute("textAttribute")]
public string StringProperty;

[XmlAttribute("numberAttribute")]
public int IntegerProperty;

[XmlAttribute("enumAttribute")]
public Enumeration EnumProperty;

[XmlAnyAttribute]
public XmlAttribute[] OtherAttributes;

[XmlArray("children")]
[XmlArrayItem("child")]
public Collection<ChildClass> CollectionProperty;

[XmlAnyElement]
public XmlElement[] OtherElements;
}

public enum Enumeration
{
[XmlEnum("item1")]
Item1,

[XmlEnum("item2")]
Item2
}

public class ChildClass
{
[XmlText]
public string Value;
}

最佳答案

Jsonix 作者:Alexey Valikov(sourceguide)可以基于可配置映射将 XML 反序列化为 JavaScript。


我贡献了代码来支持 deserializing custom classes using instance factories .这有望进入下一个版本的 Jsonix (2.0.11)。


var input = "<element1 attribute1='value1' />";

var Class1 = function () {};
Class1.prototype.toString = function () {
return this.Property1;
};

var mapping = {
elementInfos: [{
elementName: "element1",
typeInfo: new Jsonix.Model.ClassInfo({
name: "Element1",
instanceFactory: Class1,
propertyInfos: [
new Jsonix.Model.AttributePropertyInfo({
name: "Property1",
attributeName: "attribute1"
})
]
})
}]
};

var context = new Jsonix.Context([mapping]);
var unmarshaller = context.createUnmarshaller();
var result = unmarshaller.unmarshalString(input).value;

console.log(result.toString()); // logs "value1"

更长的working example在 JSFiddle 上使用问题中的 XML。

关于JavaScript 等效于 .NET XML 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25362973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com