草庐IT

c# - 从 azure 响应中反序列化 xml

coder 2024-06-29 原文

我正在寻找反序列化数据并将其放入 response from Azure 的通用类中.

<ServiceResources xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/windowsazure">
<ServiceResource>
    <Name>Airport1</Name>
    <Type>Microsoft.SqlAzure.FirewallRule</Type>
    <State>Normal</State>
    <SelfLink>https://management.core.windows.net:xxx/xxx/services/sqlservers/servers/xxx/firewallrules/Airport1</SelfLink>
    <ParentLink>https://management.core.windows.net:xxxx/services/sqlservers/servers/xxx</ParentLink>
    <StartIPAddress>000.000.000.000</StartIPAddress>
    <EndIPAddress>2000.000.000.000</EndIPAddress>
  </ServiceResource>

我需要将几个对象反序列化到我的类中。

[Serializable, XmlRoot(ElementName = "ServiceResource", Namespace = "http://schemas.microsoft.com/windowsazure/")]
public class ServiceResource
{
    [XmlElement("Name")]
    public string Name { get; set; }
    [XmlElement("Type")]
    public string Type { get; set; }
    [XmlElement("State")]
    public string State { get; set; }
    [XmlElement("SelfLink")]
    public string SelfLink { get; set; }
    [XmlElement("ParentLink")]
    public string ParentLink { get; set; }
    [XmlElement("StartIPAddress")]
    public string StartIPAddress { get; set; }
    [XmlElement("EndIPAddress")]
    public string EndIPAddress { get; set; }
} 

我已经尝试了几种不同的尝试,但都无法成功。我使用了 xmlSerializer 但遇到了障碍。

using (var responseStreamReader = new StreamReader(webResponse.GetResponseStream()))
{
    XmlSerializer serializer = new XmlSerializer(typeof(ServiceResource));
    ServiceResource deserialized = (ServiceResource)serializer.Deserialize(responseStreamReader);

}

我们将不胜感激地接受任何帮助。

最佳答案

回答

Azure REST Api 在 XML 中返回 ServiceResource 列表。所以你需要把它封装到一个类中。这是一个例子。

[XmlRoot(
    ElementName = "ServiceResources",
    Namespace = "http://schemas.microsoft.com/windowsazure")]
public class ServiceResources
{
    public ServiceResources()
    {
        Items = new List<ServiceResource>();
    }

    [XmlElement("ServiceResource")]
    public List<ServiceResource> Items { get; set; }
}

public class ServiceResource
{
    [XmlElement("Name")]
    public string Name { get; set; }
    [XmlElement("Type")]
    public string Type { get; set; }
    [XmlElement("State")]
    public string State { get; set; }
    [XmlElement("SelfLink")]
    public string SelfLink { get; set; }
    [XmlElement("ParentLink")]
    public string ParentLink { get; set; }
    [XmlElement("StartIPAddress")]
    public string StartIPAddress { get; set; }
    [XmlElement("EndIPAddress")]
    public string EndIPAddress { get; set; }
}

有了这两个类,您现在可以执行以下操作。

var response = request.GetResponse();
var message = string.Empty;
using (var responseStreamReader = new StreamReader(response.GetResponseStream()))
{
    message = responseStreamReader.ReadToEnd();
}

var textReader = new StringReader(message);
var serializer = new XmlSerializer(typeof(ServiceResources));
var serviceResources = 
    serializer.Deserialize(textReader) as ServiceResources;

演示控制台应用

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace DeserializeAzureXmlResponse
{
    class Program
    {
        private static string certificateThumbprint = "19DAED4D4ABBE0D400DC33A6D99D00D7BBB24472";
        private static string subscriptionId = "14929cfc-3501-48cf-a5c9-b24a7daaf694";
        static string sqlServerName = "mvp2015";

        static string managementUri = "https://management.core.windows.net";
        static string sqlServerApi = "services/sqlservers/servers";
        static string firewallRules = "firewallrules";

        static void Main(string[] args)
        {
            var restUri = CreateRestUri();
            var clientCert = GetX509FromPersonalStore();

            var request = (HttpWebRequest)HttpWebRequest.Create(restUri);
            request.Headers.Add("x-ms-version", "2012-03-01");
            request.ClientCertificates.Add(clientCert);

            var response = request.GetResponse();
            var message = string.Empty;
            using (var responseStreamReader = new StreamReader(response.GetResponseStream()))
            {
                message = responseStreamReader.ReadToEnd();
            }

            var textReader = new StringReader(message);
            var serializer = new XmlSerializer(typeof(ServiceResources));
            var serviceResources = serializer.Deserialize(textReader) as ServiceResources;
            foreach (var sr in serviceResources.Items)
            {
                Console.WriteLine("Name".PadRight(20) + sr.Name);
                Console.WriteLine("Type".PadRight(20) + sr.Type);
                Console.WriteLine("State".PadRight(20) + sr.State);
                Console.WriteLine("SelfLink".PadRight(20) + sr.SelfLink);
                Console.WriteLine("ParentLink".PadRight(20) + sr.ParentLink);
                Console.WriteLine("StartIP".PadRight(20) + sr.StartIPAddress);
                Console.WriteLine("EndIP".PadRight(20) + sr.EndIPAddress);
                Console.WriteLine("+++++++++++");
            }
            Console.ReadLine();
        }

        static Uri CreateRestUri()
        {
            // https://management.core.windows.net/{subscriptionID}/services/sqlservers/servers/{server}/firewallrules/
            var builder = new StringBuilder();
            builder.Append(managementUri + "/");
            builder.Append(subscriptionId + "/");
            builder.Append(sqlServerApi + "/");
            builder.Append(sqlServerName + "/");
            builder.Append(firewallRules + "/");
            var uri = new Uri(builder.ToString());
            return uri;
        }

        static X509Certificate GetX509FromPersonalStore()
        {
            // To view the personal store, press `Win + R` and then type `certmgr.msc`
            var store = new X509Store(StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, certificateThumbprint, true);
            var certificate = certificates[0];
            store.Close();
            return certificate;
        }
    }

    [XmlRoot(
        ElementName = "ServiceResources",
        Namespace = "http://schemas.microsoft.com/windowsazure")]
    public class ServiceResources
    {
        public ServiceResources()
        {
            Items = new List<ServiceResource>();
        }

        [XmlElement("ServiceResource")]
        public List<ServiceResource> Items { get; set; }
    }

    public class ServiceResource
    {
        [XmlElement("Name")]
        public string Name { get; set; }
        [XmlElement("Type")]
        public string Type { get; set; }
        [XmlElement("State")]
        public string State { get; set; }
        [XmlElement("SelfLink")]
        public string SelfLink { get; set; }
        [XmlElement("ParentLink")]
        public string ParentLink { get; set; }
        [XmlElement("StartIPAddress")]
        public string StartIPAddress { get; set; }
        [XmlElement("EndIPAddress")]
        public string EndIPAddress { get; set; }
    }
}

输出

Name                My-House
Type                Microsoft.SqlAzure.FirewallRule
State               Normal
SelfLink            https://management.core.windows.net/14929cfc-35
ParentLink          https://management.core.windows.net/14929cfc-35
StartIP             123.435.234.643
EndIP               123.435.234.643
+++++++++++
Name                AllowAllWindowsAzureIps
Type                Microsoft.SqlAzure.FirewallRule
State               Normal
SelfLink            https://management.core.windows.net/14929cfc-35
ParentLink          https://management.core.windows.net/14929cfc-35
StartIP             0.0.0.0
EndIP               0.0.0.0
+++++++++++

另见

Is it possible to deserialize XML into List<T>?

List Firewall Rules

关于c# - 从 azure 响应中反序列化 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569221/

有关c# - 从 azure 响应中反序列化 xml的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. ruby-on-rails - Ruby on Rails 可以部署在 Azure 网站上吗? - 2

    我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  9. ruby-on-rails - carrierwave:在序列化动态属性上安装 uploader - 2

    首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟

  10. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

    我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

随机推荐