反序列化动态 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 的相关文章

  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 适用于 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下面总是采用这种格式 但是下面的元素