我正在尝试在响应数据中获取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。这很有意思,但为什么呢?
答案 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。因此你必须:
例如:
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.