C#解析CDATA得到BaseCod64

Parsing CDATA with C# to get BaseCod64

我正在尝试在我的响应数据中获取 baseCode64 数据。我正在获取 ReturnCode 但如何获取 "Payload".

中的数据

例如我的响应数据看起来像这样:

 <xml_response xsi:type="xsd:string"><![CDATA[<CertificateRequest><ReturnCode>0</ReturnCode><Payload content_type="application/pdf" embedded="base64">SGVsbG8gV29ybGQ=</Payload></CertificateRequest>]]></xml_response>

为了获得 ReturnValue,我编写了以下代码:

  XElement xmlTree = XElement.Parse(response_data);
  XElement returnCode = xmlTree.Element("ReturnCode");
  XText returnCode_Value = returnCode.FirstNode as XText;
  String b1 = returnCode_Value.Value;      

现在,我如何获取有效负载中的值,然后将其转换为纯文本或创建 pdf。

我尝试对 paylaod 使用相同的方法,但我没有用。我什么也没得到:

XElement returnCode = xmlTree.Element("Payload");

如果我用以下元素显示元素:

XElement xmlTree = XElement.Parse(response_data);
XElement new_data = xmlTree.Elements();

我刚刚得到:

0

我已经显示了Element Payload。这很有趣,但为什么呢?

我会简单地使用 XmlSerializer 读取响应的内容,这使得将数据读入对象变得非常容易,甚至可以通过隐藏的 属性

所以要阅读证书请求,您可以执行以下 2 类

public class CertificateRequest
{
    [XmlElement("ReturnCode")]
    public int ReturnCode { get; set; }

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

public class Payload
{
    [XmlAttribute("content_type")]
    public string ContentType { get; set; }
    [XmlAttribute("embedded")]
    public string Embedded { get; set; }
    [XmlText]
    public string Value { get; set; }

    [XmlIgnore]
    public string DecodedValue
    {
        get
        {
            if (string.IsNullOrWhiteSpace(Value))
            {
                return string.Empty;
            }
            return System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(Value));
        }
    }
}

然后使用内存流读取字符串,将其反序列化为证书请求对象,如下所示:

class Program
{
    static CertificateRequest DeserializeRequest(string content)
    {
        CertificateRequest request = null;
        using (MemoryStream ms = new MemoryStream())
        {
            byte[] data = System.Text.Encoding.UTF8.GetBytes("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + content);
            ms.Write(data, 0, data.Length);
            ms.Position = 0;
            XmlSerializer xs = new XmlSerializer(typeof(CertificateRequest));
            request = xs.Deserialize(ms) as CertificateRequest;
        }
        return request;
    }

    static void Main(string[] args)
    {
        string xmlAsString = @"<CertificateRequest><ReturnCode>0</ReturnCode><Payload content_type=""application/pdf"" embedded=""base64"">SGVsbG8gV29ybGQ=</Payload></CertificateRequest>";
        CertificateRequest request = DeserializeRequest(xmlAsString);
        Console.WriteLine(request.Payload.Value);
        Console.WriteLine(request.Payload.DecodedValue);
        Console.ReadLine();
    }
}

然后将在第二行打印 base64 编码值 + Hello world(好的 :D)

您没有在尝试访问 Payload 的值的地方显示代码,所以我有点猜测您想要做什么,但试试这个:

XElement payload = xmlTree.Element("Payload");
string b2 = payload.Value;

首先,您的 XML 不会加载,因为它缺少 xsi 的命名空间声明。我通过添加以下内容修复了它:

<xml_response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string" ...

完成后,您的 XML 包含一个嵌入的文本字符串文字(表示为 CDATA),它本身就是 XML。因此你必须:

  1. 解析外层XML.
  2. 将字符数据提取为字符串。
  3. 解析内部XML.

例如:

        string response_data = @"<xml_response xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xsi:type=""xsd:string""><![CDATA[<CertificateRequest><ReturnCode>0</ReturnCode><Payload content_type=""application/pdf"" embedded=""base64"">SGVsbG8gV29ybGQ=</Payload></CertificateRequest>]]></xml_response>";

        var xmlTree = XElement.Parse(response_data);
        var innerXml = xmlTree.Value; // Extract the string literal
        var innerXmlTree = XElement.Parse(innerXml); // Parse the string literal as XML
        var payload = innerXmlTree.Element("Payload").Value; // Extract the payload value
        Debug.Assert(payload == "SGVsbG8gV29ybGQ="); // No assert.