首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用重复嵌套标记反序列化XML

用重复嵌套标记反序列化XML
EN

Stack Overflow用户
提问于 2022-10-13 11:19:50
回答 2查看 37关注 0票数 0

反序列化--在多个级别上重复相同标记的请求的结果,我让它正常工作,但是为了做到这一点,我在尝试反序列化XML之前更改它的格式。

我无法编辑XML的源代码以将其更改为只有一个级别的Diary

是否有一种无需调整响应就可以调整XML属性以处理反序列化的方法?

XML响应

代码语言:javascript
复制
<?xml version="1.0" ?>
<Root>
    <DiaryDetails>
        <Diary>
            <Diary created_user="value1" created_date="value2" long_text="value3" short_text="value4" entry_type="value5" >Value6</Diary>
        </Diary>
        <Diary>
            <Diary created_user="value7" created_date="value8" long_text="value9" short_text="value10" entry_type="value11" >Value12</Diary>
        </Diary>
    </DiaryDetails>
</Root>

类定义

代码语言:javascript
复制
[XmlRoot("DiaryDetails")]
public class Diaries : List<Diary> { }

[XmlRoot("Diary")]
public class Diary
{
    [XmlAttribute("created_user")]
    public string CreatedBy { get; set; }

    [XmlAttribute("created_date")]
    public string CreatedDate { get; set; }
    [XmlAttribute("long_text")]
    public string LongText { get; set; }

    [XmlAttribute("short_text")]
    public string ShortText { get; set; }

    [XmlAttribute("entry_type")]
    public string Type { get; set; }
}

反序列化方法

代码语言:javascript
复制
internal T DeserilaiseObject<T>(string response)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    T DeserilaisedObject;

    using (TextReader reader = new StringReader(response))
    {
        DeserilaisedObject = (T)serializer.Deserialize(reader);
    }
    return DeserilaisedObject;
}

我目前正在用字符串替换来处理这个问题:

代码语言:javascript
复制
response = response.Replace("<Diary><Diary", "<Diary").Replace("</Diary></Diary>", "</Diary>");
EN

回答 2

Stack Overflow用户

发布于 2022-10-13 11:39:10

尝试以下几个方面:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;



namespace ConsoleApplication40
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Root));
            Root root = (Root)serializer.Deserialize(reader);
 
        }
    }
    [XmlRoot("Root")]
    public class Root
    {
        [XmlArray("DiaryDetails")]
        [XmlArrayItem("Diary")]
        public List<DiaryMain> diaries { get; set; }
    }
    public class DiaryMain
    {
        public Diary Diary { get; set; }
    }

    [XmlRoot("Diary")]
    public class Diary
    {
        [XmlAttribute("created_user")]
        public string CreatedBy { get; set; }

        [XmlAttribute("created_date")]
        public string CreatedDate { get; set; }
        [XmlAttribute("long_text")]
        public string LongText { get; set; }

        [XmlAttribute("short_text")]
        public string ShortText { get; set; }

        [XmlAttribute("entry_type")]
        public string Type { get; set; }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-10-13 12:00:33

假设您只对第二个嵌套级别的属性化Diary元素感兴趣,您可以这样做:

代码语言:javascript
复制
// load your xml into a document
var doc = new XmlDocument();
doc.Load("your_xml_file.xml");

// extract the interesting nodes using xpath
var nodes = doc.SelectNodes("//Diary/Diary");

// deserialize the filtered NodeList (yes it's that clunky)
var serializer = new XmlSerializer(typeof(Diary));
var diaries = nodes.Cast<XmlNode>().Select(x => serializer.Deserialize(new XmlNodeReader(x))).Cast<Diary>().ToArray();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74054903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档