我有一个从 wcf 返回的 xml,我必须将其反序列化为对象。不幸的是,我无法使用 wcf 数据契约,因为我的公司正在淘汰 WCF,所以这个解决方案是临时的。我尝试将其作为我的其他反序列化,但它不起作用,我认为这是因为
Result
中的双重名称空间。
<ServiceResponse xmlns="http://www.julianuslemurrex.com/MyWcfService/2023/9/19">
<ServiceResult xmlns:a="http://schemas.datacontract.org/2023/9/MyWcfService.Model.DataTransfer" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:IsEmployee i:nil="true"/>
<a:IsContractor i:nil="true"/>
<a:EmployeeReference>EMEM001F1</a:EmployeeReference>
</ServiceResult>
</ServiceResponse>
我创建了两个类:
[XmlRoot(ElementName="ServiceResponse")]
public class EmployeeDtoRoot
{
[XmlElement(ElementName="ServiceResult")]
public EmployeeDto Root { get; set; }
}
[XmlRoot("ServiceResult")]
public class EmployeeDto
{
[XmlElement("IsEmployee")]
public bool IsEmployee { get; set; }
[XmlElement("IsContractor")]
public bool IsContractor { get; set; }
[XmlElement("EmployeeReference")]
public string EmployeeReference { get; set; }
}
反序列化部分代码:
using (XmlTextReader xtr = new XmlTextReader(xmlToDeserialize))
{
XmlSerializer serializer = new XmlSerializer(typeof(EmployeeDtoRoot));
xtr.Namespaces = false;
xtr.DtdProcessing = DtdProcessing.Parse;
var root = (EmployeeDtoRoot)serializer.Deserialize(xtr);
var r = root;
}
这两个类以正确的关系连接,但
EmployeeDto
中的值为空。上面的解决方案应该忽略命名空间,但 xml 无论如何都不会被解析。
我该如何解析这个?甚至不需要
EmployeeDtoRoot
,我只需要 xml 中的三个元素:IsEmployee
、IsContractor
和 Employeereference
。
IsEmployee 和 IsContractor 在 XML 中均为 null,但在类定义中它们不可为 null。
<a:IsEmployee i:nil="true"/>
<a:IsContractor i:nil="true"/>
所以 EmployeeDto 应该是这样的:
[XmlRoot("ServiceResult")]
public class EmployeeDto
{
[XmlElement("IsEmployee")]
public bool? IsEmployee { get; set; }
[XmlElement("IsContractor")]
public bool? IsContractor { get; set; }
[XmlElement("EmployeeReference")]
public string EmployeeReference { get; set; }
}