解析 dotnet 中包含两个命名空间的 XML

问题描述 投票:0回答:1

我有一个从 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

c# .net .net-core xml-parsing
1个回答
0
投票

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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.