反序列化部分 SOAP 响应
Deserialize part of SOAP response
我对 soap 响应的特定部分的反序列化有点迷茫。
回复:
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body>
<ns1:LoginResult xmlns:ns1="http://abc.def.schema">
<sessionId>123456789</sessionId>
<sessionTimeout>30</sessionTimeout>
<organizationName>WebService Test Account XYZ</organizationName>
<userInfoResult>
<accessibleOrgs>
<name>WebService Test Account XYZ</name>
<description/>
<prefix>10</prefix>
<countryCallingCode>+49</countryCallingCode>
<treeLevel>0</treeLevel>
<timeZone>
<timeZoneId>Europe/Berlin</timeZoneId>
<currentUtcOffset>3600000</currentUtcOffset>
</timeZone>
<billingCompany>COMPANY 123</billingCompany>
<language>DE</language>
</accessibleOrgs>
<isDemo>true</isDemo>
<prefixLength>0</prefixLength>
<alarmNumberLength>0</alarmNumberLength>
<groupNumberLength>0</groupNumberLength>
<personNumberLength>0</personNumberLength>
</userInfoResult>
</ns1:LoginResult>
</soapenv:Body>
我需要反序列化 "LoginResult" 部分。我知道反序列化方法,但我正在为 A) 有名称空间和 B) 我只需要 XML.
的一个子集而苦苦挣扎
也许有人可以指出正确的方向。
提前谢谢
从 LoginResult 的定义开始 class。
[XmlRootAttribute(Namespace = "http://abc.def.schema", IsNullable = false, ElementName = "LoginResult")]
public class LoginResult
{
[XmlElement(Namespace ="")]
public int sessionId { get; set; }
[XmlElement(Namespace = "")]
public string organizationName { get; set; }
..... some more properties
}
- 使用
System.Xml.Linq
中的 XDocument class 解析 xml.
- 找到 "LoginResult" 元素。
反序列化为 LoginResult
类型。
var xDoc = XDocument.Parse(str);
var xLoginResult = xDoc.Root.Descendants().FirstOrDefault(d => d.Name.LocalName.Equals("LoginResult"));
var serializer = new XmlSerializer(typeof(LoginResult));
using (var reader = xLoginResult.CreateReader())
{
var result = (LoginResult)serializer.Deserialize(reader);
}
我对 soap 响应的特定部分的反序列化有点迷茫。
回复:
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body>
<ns1:LoginResult xmlns:ns1="http://abc.def.schema">
<sessionId>123456789</sessionId>
<sessionTimeout>30</sessionTimeout>
<organizationName>WebService Test Account XYZ</organizationName>
<userInfoResult>
<accessibleOrgs>
<name>WebService Test Account XYZ</name>
<description/>
<prefix>10</prefix>
<countryCallingCode>+49</countryCallingCode>
<treeLevel>0</treeLevel>
<timeZone>
<timeZoneId>Europe/Berlin</timeZoneId>
<currentUtcOffset>3600000</currentUtcOffset>
</timeZone>
<billingCompany>COMPANY 123</billingCompany>
<language>DE</language>
</accessibleOrgs>
<isDemo>true</isDemo>
<prefixLength>0</prefixLength>
<alarmNumberLength>0</alarmNumberLength>
<groupNumberLength>0</groupNumberLength>
<personNumberLength>0</personNumberLength>
</userInfoResult>
</ns1:LoginResult>
</soapenv:Body>
我需要反序列化 "LoginResult" 部分。我知道反序列化方法,但我正在为 A) 有名称空间和 B) 我只需要 XML.
的一个子集而苦苦挣扎也许有人可以指出正确的方向。
提前谢谢
从 LoginResult 的定义开始 class。
[XmlRootAttribute(Namespace = "http://abc.def.schema", IsNullable = false, ElementName = "LoginResult")]
public class LoginResult
{
[XmlElement(Namespace ="")]
public int sessionId { get; set; }
[XmlElement(Namespace = "")]
public string organizationName { get; set; }
..... some more properties
}
- 使用
System.Xml.Linq
中的 XDocument class 解析 xml. - 找到 "LoginResult" 元素。
反序列化为
LoginResult
类型。var xDoc = XDocument.Parse(str); var xLoginResult = xDoc.Root.Descendants().FirstOrDefault(d => d.Name.LocalName.Equals("LoginResult")); var serializer = new XmlSerializer(typeof(LoginResult)); using (var reader = xLoginResult.CreateReader()) { var result = (LoginResult)serializer.Deserialize(reader); }