使用C#解析CDATA以获取BaseCod64

时间:2015-03-16 16:03:34

标签: c# xml xml-parsing

我正在尝试在响应数据中获取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;      

现在,我怎样才能获得Payload中的Value,我将以纯文本转换或创建pdf。

我尝试以同样的方式使用paylaod,但我没有工作。我一无所获:

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

如果我用:

显示元素
XElement xmlTree = XElement.Parse(response_data);
XElement new_data = xmlTree.Elements();

我刚刚收到:

0

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

3 个答案:

答案 0 :(得分:1)

我只是使用XmlSerializer读取响应的内容,它使得将数据读入对象变得非常容易,甚至可以通过隐藏属性完成解码

因此,要阅读证书申请,您可以选择以下两个类

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));
        }
    }
}

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

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)

答案 1 :(得分:0)

您没有显示您尝试访问Payload值的代码,因此我猜测您想要做什么,但请尝试以下操作:

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

答案 2 :(得分:0)

首先,您的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。
  4. 例如:

            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.