【问题标题】:Deserialize only specific Nodes from Xml to Object仅将特定节点从 Xml 反序列化为 Object
【发布时间】:2019-02-04 21:59:20
【问题描述】:

我正在尝试从 Xml 中获取特定节点并将其写入一个类。我有这个。

public class TradeMark
{
    [XmlElement]
    public string MarkVerbalElementText { get; set; }
    [XmlElement]
    public int MarkCurrentStatusCode { get; set; }
    [XmlElement]
    public string ExpiryDate { get; set; } = ""; 
}
   static void Main(string[] args)
    {
       XmlSerializer serializer = new XmlSerializer(typeof(TradeMark));
        using (TextReader reader = new StreamReader(pathToImportFile))
        {
            tradeMark = (TradeMark)serializer.Deserialize(reader);
        }
    }

在我的 Xml 数据中,除了这 3 个节点之外,还有更多节点。现在,当我运行代码时,它说......不是预期的。我猜是公元前。它试图反序列化所有内容,而不仅仅是 Class TradeMark 中的这 3 个 Infomartionen。

谁能帮忙?

XML

<?xml version="1.0" encoding="UTF-8"?>
<Transaction xmlns="http://euipo.europa.eu/trademark/data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://euipo.europa.eu/trademark/data http://euipo.europa.eu/schemas/trademark/EM-TM-TradeMark-V3-2.xsd">
<TransactionHeader>
        <SenderDetails>
            <RequestProducerDateTime>2018-08-18T15:33:35</RequestProducerDateTime>
        </SenderDetails>
    </TransactionHeader>
<TradeMarkTransactionBody>
<TransactionContentDetails>
<TransactionIdentifier>017690538</TransactionIdentifier>
<TransactionCode>EM-Trade Mark</TransactionCode>
<TransactionData>
<TradeMarkDetails>
<TradeMark operationCode="Insert">
<RegistrationOfficeCode>EM</RegistrationOfficeCode>
<ApplicationNumber>017690538</ApplicationNumber>
<ApplicationDate>2018-01-16</ApplicationDate>
<RegistrationDate>2018-06-14</RegistrationDate>
<ApplicationLanguageCode>en</ApplicationLanguageCode>
<SecondLanguageCode>es</SecondLanguageCode>
<ExpiryDate>2028-01-16</ExpiryDate>
<MarkCurrentStatusCode milestone="23" status="1">Registered</MarkCurrentStatusCode>
<MarkCurrentStatusDate>2018-06-15</MarkCurrentStatusDate>
<KindMark>Individual</KindMark>
<MarkFeature>Figurative</MarkFeature>
<TradeDistinctivenessIndicator>false</TradeDistinctivenessIndicator>
<WordMarkSpecification>
<MarkVerbalElementText>Tiens</MarkVerbalElementText>
</WordMarkSpecification>

【问题讨论】:

  • 你能发布确切的错误吗?另外,你能发布完整的 XML 吗?它可能格式不正确。

标签: c# xml deserialization


【解决方案1】:

这很可能是因为您的 XML 有一个默认命名空间,而 Transaction 位于该命名空间内。 您需要使用XmlRootAttribute 标记您的课程,如下所示:

[XmlRootAttribute("TradeMark", Namespace="http://euipo.europa.eu/trademark/data", 
IsNullable = false)]
public class TradeMark

【讨论】:

  • 没什么区别,还是一样的异常
【解决方案2】:

XmlIgnore 就是你要找的。​​p>

MSDN Docs

请参阅this 答案中的说明,因为文档仅声明 XmlIgnore 将在序列化时被忽略,但在反序列化时也会被忽略。

从你的例子:

public class TradeMark
{
    [XmlElement]
    public string MarkVerbalElementText { get; set; }
    [XmlElement]
    public int MarkCurrentStatusCode { get; set; }
    [XmlElement]
    public string ExpiryDate { get; set; } = ""; 
    [XmlIgnore]
    public string IgnoreMe { get; set; } // This will be ignored
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多