反序列化动态 XML

2024-03-06

The XML下面总是采用这种格式,但是下面的元素<Hit>节点是动态的,项目的名称或数量每次都可能不同。是否可以获取下面的元素<Hit>动态节点。

<SearchResponse>
    <Response>
        <Qtime>3</Qtime>
        <HitsPerPage>10</HitsPerPage>
    </Response>
    <HitsCount>
        <total>33</total>
        <start>0</start>
        <end>10</end>
    </HitsCount>
    <Hits>
        <Hit>
            <id type=''>123</id>
            <eid type=''>456</eid>
            <Title type='t'>
                <![CDATA[title goes here]]>
            </Title>
        </Hit>
        <Hit>
            <id type=''>123</id>
            <oid type=''>456</oid>
            <Title type='t'>
                <![CDATA[title goes here]]>
            </Title>
            <Description type='s'>
                <![CDATA[Description goes here]]>
            </Description>
        </Hit>
    </Hits>
</SearchResponse>

编辑:这是 C# 代码,它工作正常并从<Hit>节点,因为我已经定义了该属性,但我需要将它们全部动态化。

[XmlRoot("SearchResponse")]
    public sealed class SearchResponse {
        [XmlElement("Response", Type = typeof(Response))]
        public Response[] Responses { get; set; }

        [XmlElement("HitsCount", Type = typeof(HitsCount))]
        public HitsCount[] HitsCount { get; set; }

        [XmlElement("Hits", Type = typeof(Hits))]
        public Hits[] Hits { get; set; }


        public static SearchResponse GetSearchResponseObject(string xmlString) {
            try {
                var reader = new StringReader(xmlString);
                var serializer = new XmlSerializer(typeof(SearchResponse));
                var instance = (SearchResponse)serializer.Deserialize(reader);

                return instance;
            } catch (Exception ex) {
                var asd = ex.Message;
                return null;
            }
        }
    }

    [Serializable]
    public class Response {
        [XmlElement("Qtime")]
        public string Qtime { get; set; }

        [XmlElement("HitsPerPage")]
        public string HitsPerPage { get; set; }

    }

    [Serializable]
    public class HitsCount {
        [XmlElement("total")]
        public string Total { get; set; }

        [XmlElement("start")]
        public string Start { get; set; }

        [XmlElement("end")]
        public string End { get; set; }
    }

    [Serializable]
    public class Hits {

        [XmlElement("Hit")]
        public Hit[] Hit { get; set; }
    }

    [Serializable]
    public class Hit {
        [XmlElement("id")]
        public string Id { get; set; }
    }

编辑2://命中类代码

public class Hit {

        // Since "id" is expected in the XML, deserialize it explicitly.
        [XmlElement("id")]
        public string Id { get; set; }

        private readonly List<XElement> _elements = new List<XElement>();

        [XmlAnyElement]
        public List<XElement> Elements { get { return _elements; } }

    }

因为您不知道您的产品中可能存在哪些元素Hit类,你可以添加一个List<XElement>财产给你的班级并附上[XmlAnyElement] https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlanyelementattribute%28v=vs.110%29.aspx归因于它。然后,它将捕获该类的 XML 中的所有未知元素。元素反序列化后,您可以添加 API 属性来查询具有特定名称的元素,例如:

public class Hit
{
    // Since "id" is expected in the XML, deserialize it explicitly.
    [XmlElement("id")]
    public string Id { get; set; }

    private readonly List<XElement> elements = new List<XElement>();

    [XmlAnyElement]
    public List<XElement> Elements { get { return elements; } }

#region convenience methods

    public string this[XName name]
    {
        get
        {
            return Elements.Where(e => e.Name == name).Select(e => e.Value).FirstOrDefault();
        }
        set
        {
            var element = Elements.Where(e => e.Name == name).FirstOrDefault();
            if (element == null)
                Elements.Add(element = new XElement(name));
            element.Value = value;
        }
    }

    const string title = "Title";

    [XmlIgnore]
    public string Title
    {
        get
        {
            return this[title];
        }
        set
        {
            this[title] = value;
        }
    }

#endregion
}

顺便说一下,你可以消除你的Hits类,如果您标记Hits数组与[XmlArray] https://msdn.microsoft.com/en-US/library/system.xml.serialization.xmlarrayattribute(v=vs.110).aspx而不是[XmlElement],像这样:

[XmlRoot("SearchResponse")]
public sealed class SearchResponse
{
    [XmlElement("Response", Type = typeof(Response))]
    public Response[] Responses { get; set; }

    [XmlElement("HitsCount", Type = typeof(HitsCount))]
    public HitsCount[] HitsCount { get; set; }

    [XmlArray("Hits")] // Indicates that the hits will be serialized with an outer container element named "Hits".
    [XmlArrayItem("Hit")] // Indicates that each inner entry element will be named "Hit".
    public Hit [] Hits { get; set; }
}

Update

The

    public string this[XName name] { get; set; }

Is an indexer https://msdn.microsoft.com/en-us/library/6x16t2tx.aspx. See 使用索引器(C# 编程指南) https://msdn.microsoft.com/en-us/library/2549tw02.aspx。我添加了它,这样就可以很容易地执行以下操作:

var description = hit["Description"];
var title = hit["Title"];

索引器查找具有指定名称的第一个 XML 元素,并返回其文本值 https://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.value%28v=vs.110%29.aspx。如果您不需要它,可以将其省略——这只是为了方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化动态 XML 的相关文章

随机推荐

  • 适用于 Android 的“实时”内存分析工具

    是否有适用于 Android 的 实时 内存分析器工具 类似于 XCode 中的 Instruments 大多数对内存分析的搜索都会引导我使用内存分析器工具 这很棒 但我非常感谢一个可以动态显示哪些类在应用程序的生命周期中消耗 和释放 内存
  • React:如何对渲染的组件的变化进行动画处理?

    我更改了通过时间间隔呈现的组件 我希望能够在每次发生变化时添加动画 最好的方法是什么 constructor props super props this state currentComponent 1 numberOfComponent
  • 将服务引用添加到 WP8 应用程序时出现问题

    我尝试添加服务引用http www webservicex com globalweather asmx WSDL网络服务 我转到 添加服务引用 它发现它很好 但是当我尝试单击 确定 时 出现错误 无法签出当前文件 该文件可能是只读的或锁定
  • JavaFX并发任务设置状态

    我正在为我的应用程序创建 UI 该应用程序与其他平台的版本共享核心模块 在JavaFX中 我尝试使用Task http docs oracle com javafx 2 api javafx concurrent Task htmls 在后
  • PHP 基于当前文件路径动态包含

    我想找到一种方法来包含基于当前文件路径的一些文件 例如 我有 website com templates name1 index php 这个 index php应该是一个独特的文件 我将在不同深度的许多不同目录中使用它 所以我想让代码通用
  • 如何使用数字字符实体而不是问号将 XmlDocument.Save() 编码为“us-ascii”?

    我的目标是获得一个二进制缓冲区 MemoryStream ToArray 会产生byte 在本例中 的 XML 且不会丢失 Unicode 字符 我希望 XML 序列化程序使用数字字符引用来表示任何在 ASCII 中无效的内容 到目前为止
  • 在node-sqlite3中使用Gyp中的共享库

    我是吉普新手 我不想编译我的依赖项 而是想使用共享库 特别是我的计算机上已有的 libsqlite3 so 主要的 binding gyp 目前看起来像 targets target name node sqlite3 sources sr
  • 国际键盘上常用字符的键码

    好的 从特殊符号捕获按键代码会在不同布局的键盘上产生不同的结果 但是像 a z 这样的 常见 字符呢 如果您有 QWERTY 键盘 您将获得按键代码81当你输入时q 当您拥有 AZERTY 键盘时 您会获得代码吗81当你按a since a
  • 在 HttpModule 中重写 URL 时如何使波形符 (~) 运算符起作用?

    我在用重写路径 http msdn microsoft com en us library 1kz7fdx9 aspx in an IHttpModule 路由 到子 Web 应用程序 如以下 IIS 布局所示 例如 当请求 根 布莱赫进来
  • 修改并重新编译Android SDK

    我知道Android中实现的一些方法和一些类没有导出到Android公共SDK中 我已经能够通过编译我的应用程序并将其放置在 Android 树中来创建一个使用其中一些功能的应用程序 是否可以通过从源代码重新编译这些函数来将其导出到 And
  • 如何将一个数组输入与另一个数组输入关联起来?

    假设我有 2 个扫描仪填充的阵列 name and age 每一项都按顺序填写 如果我要找到数组中最年长的人 如何使用数组打印出他们的名字和年龄 例如最大的条目age was 78 有没有办法将其与name 数组来打印它 参考代码 publ
  • 当元素有多个类时,jquery 按特定类查找元素

    所以我正在做一些后端团队在构建时没有经过深思熟虑的事情 这给我留下了一个充满 div 的文档 我正在做的是从我需要单击的元素回滚 获取父容器 然后在父容器中找到一个元素class alert box warn class alert box
  • 在自定义损失函数中重塑张量

    我有一个类似的问题这个问题 https stackoverflow com questions 43056512 reshape tensorflow tensor inside keras loss function 我正在尝试在 ker
  • 使用 WorkflowServiceHost 进行 WF4 工作流版本控制

    相关这个问题 https stackoverflow com questions 2064518 loading persisted workflow after workflowdefinition has changed in wf4
  • Android:ListAdapter 示例重绘相同内容

    我使用此示例中的 ListAdapter http code google com p au optimizing layouts 201 source browse au optimizinglayouts src com example
  • 显示在 SQL Management Studio (2008) 中为表创建命令

    我刚刚开始使用 SQL Management Studio 我想知道是否可以显示现有表的创建命令 我已经能够在 Oracle SQL Developer 中做到这一点 我试图问 google 叔叔 但可能只使用过错误的搜索命令 无论如何 有
  • 背景图像路径在 CSS 中不起作用

    相对路径在 CSS 中不起作用 尽管它是正确的 width 64px background url images abc xyz bottom navigation jpg no repeat 0 0 萤火虫给出这个错误 Folder pa
  • Django内连接查询

    我正在使用 django 很难掌握如何进行复杂的查询 这是我的模型 class TankJournal models Model user models ForeignKey User tank models ForeignKey Tank
  • 如何取消目标c中的本地单个通知

    你能帮我看看如何在 iOS 10 中取消本地通知吗 UNUserNotificationCenter center UNUserNotificationCenter currentNotificationCenter center remo
  • 反序列化动态 XML

    The XML下面总是采用这种格式 但是下面的元素