.NET XML 反序列化的 JavaScript 等效项

标签 javascript unmarshalling xml-deserialization jsonix

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

我正在寻找的功能:

  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。

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

相关文章:

powershell - 反序列化对象类型问题 - 特别是 Powershell 5 类和 Import-CliXml

java - XStream - 加载自定义 XML

C# XML 反序列化 xmlns

javascript - HTML div 标签输入颜色值控制新的 html div 元素

javascript - HTML/JavaScript 应用程序的 LDAP 身份验证

javascript - dat.GUI 和复杂变量

arrays - 解码 JSON 结构中的数组

javascript - Swiper slider 不会为 slider 布局加载多个 View

java - 使用列表将 XML 解码为对象会返回 Null 对象

arrays - 将带有嵌套数组和对象的 JSON 数据解码为 Go 结构