代码之家  ›  专栏  ›  技术社区  ›  ChadT

反序列化XMLto对象数组或单个对象

  •  2
  • ChadT  · 技术社区  · 15 年前

    我正在尝试编写一个通用方法,用于将xml反序列化为对象数组。

    <people>
        <person>
            <someElement>content</someElement>
        </person>
        <person>
            <someElement>more content</someElement>
        </person>
    </people>
    

    如下代码所示 xmlDoc . 和一个 person 分类为 T

    XmlNodeReader reader = new XmlNodeReader(xmlDoc.DocumentElement);
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]), new XmlRootAttribute(xmlDoc.DocumentElement.Name));
    results = xmlSerializer.Deserialize(reader) as T[];
    

    person[] 有两个条目。

    但是,在我使用的API中,如果只返回1个结果,它只返回:

    <person>
        <someElement>content</someElement>
    </person>
    

    我的反序列化失败了。 人[] 仍为空。

    你有什么想法来实现这一点吗?

    编辑

    我正在考虑在两者之间运行XSLT,并传递 T 在中,如果它与根节点匹配,则添加包装节点?

    2 回复  |  直到 15 年前
        1
  •  1
  •   ChadT    15 年前

    <xsl:template match="/">
        <rootNode>
            <xsl:apply-templates select="node()|@*"/>
        </rootNode>
    </xsl:template>
    

    (不确定这个XSLT是否理想,希望有一些评论)。

    这将从api中包装入站XML。我之前提到的 Person 班级有一个 [XmlType("person")]

    //using reflection to look what the XmlType has been declared on this type
    var typeAttributes = Attribute.GetCustomAttribute(typeof(T), typeof(XmlTypeAttribute));
    
    //determine an xpath query to find this type of elements parent
    string xPathtoTypeName = string.Format("//{0}/parent::node()", ((XmlTypeAttribute)typeAttributes).TypeName);
    
    //use the above xpath query to find the parent node.
    var parentNode = transformedDocument.SelectSingleNode(xPathtoTypeName);
    
    //deserialize as before
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]), new XmlRootAttribute(parentNode.Name));
    XmlNodeReader nodeReader = new XmlNodeReader(parentNode);
    results = xmlSerializer.Deserialize(nodeReader) as T[];
    
        2
  •  0
  •   VMAtm    15 年前

    检查根元素的名称,如果不是 people ,将其添加到xml中,一切都会正常进行。


    更新: 检查xml文档的深度,如果其==2,则创建根元素。 XElement.Descandants("person") -数组 person -元素