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。因此你必须:
- 解析外层XML.
- 将字符数据提取为字符串。
- 解析内部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.
我正在尝试在我的响应数据中获取 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。因此你必须:
- 解析外层XML.
- 将字符数据提取为字符串。
- 解析内部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.