似乎所需的元素包含内部文本,而另一个没有。
下面我将展示如何为 XML 创建类(完整的代码在最后)。
鉴于以下 XML 结构,
<Root>
<Message>
<Transaction>
...
</Transaction>
</Message>
</Root>
我们将使用以下类名:
- 根:
- RootMessage:“根”+“消息”
- RootMessageTransaction:“RootMessage”+“交易”
对于“事务”下包含属性的任何元素,我们也将为它创建一个类。我们将遵循与上述类似的命名策略。
例如:TransactionFunction 将具有以下类名:RootMessageTransactionTransactionFunction
RootMessageTransactionTransactionFunction:
public class RootMessageTransactionTransactionFunction
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
注意:如果元素有更多属性,我们也会添加它们。
给定:
<TransactionFunction group_element="2TRG08">FMG</TransactionFunction>
内文是:FMG
用法:
[XmlElement(ElementName = "TransactionFunction")]
public RootMessageTransactionTransactionFunction TransactionFunction { get; set; } = new RootMessageTransactionTransactionFunction();
由于FormalTransactionAddress 和InformalTransactionAddress 出现不止一次,我们将为它们中的每一个使用一个列表。我们还将添加对 InnerText 进行降序排序的功能 - 这会将包含 InnerText 中值的元素放在索引 0 中。
FormalTransactionAddress 将具有以下名称:RootMessageTransactionFormalTransactionAddress
RootMessageTransactionFormalTransactionAddress:
public class RootMessageTransactionFormalTransactionAddress : IComparable<RootMessageTransactionFormalTransactionAddress>
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
public int CompareTo(RootMessageTransactionFormalTransactionAddress other)
{
//sort desc
if (String.Compare(this.InnerText, other.InnerText, StringComparison.InvariantCultureIgnoreCase) == 0)
{
return 0;
}
else if (String.Compare(this.InnerText, other.InnerText, StringComparison.InvariantCultureIgnoreCase) > 0)
{
return -1; //sort desc
}
else
{
return 1;
}
}
}
用法:
[XmlElement(ElementName = "FormalTransactionAddress")]
public List<RootMessageTransactionFormalTransactionAddress> FormalTransactionAddress { get; set; } = new List<RootMessageTransactionFormalTransactionAddress>();
以下是从 OP 反序列化 XML 所需的完整代码。
创建一个类(名称:RootMessageTransaction.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace XmlSerialization6656
{
public class RootMessageTransaction
{
[XmlElement(ElementName = "ApplicationSoftwareRevisionLevel")]
public RootMessageTransactionApplicationSoftwareRevisionLevel ApplicationSoftwareRevisionLevel { get; set; } = new RootMessageTransactionApplicationSoftwareRevisionLevel();
[XmlElement(ElementName = "AutomationLevel")]
public RootMessageTransactionAutomationLevel AutomationLevel { get; set; } = new RootMessageTransactionAutomationLevel();
[XmlElement(ElementName = "CycleBusinessPurpose")]
public RootMessageTransactionCycleBusinessPurpose CycleBusinessPurpose { get; set; } = new RootMessageTransactionCycleBusinessPurpose();
[XmlElement(ElementName = "DeletedTransactionDate")]
public RootMessageTransactionDeletedTransactionDate DeletedTransactionDate { get; set; } = new RootMessageTransactionDeletedTransactionDate();
[XmlElement(ElementName = "DeletedTransactionEffectiveDate")]
public RootMessageTransactionDeletedTransactionEffectiveDate DeletedTransactionEffectiveDate { get; set; } = new RootMessageTransactionDeletedTransactionEffectiveDate();
[XmlElement(ElementName = "DeletedYear2000LogicCode")]
public RootMessageTransactionDeletedYear2000LogicCode DeletedYear2000LogicCode { get; set; } = new RootMessageTransactionDeletedYear2000LogicCode();
[XmlElement(ElementName = "ErrorProcessingOption")]
public RootMessageTransactionErrorProcessingOption ErrorProcessingOption { get; set; } = new RootMessageTransactionErrorProcessingOption();
[XmlElement(ElementName = "FormalTransactionAddress")]
public List<RootMessageTransactionFormalTransactionAddress> FormalTransactionAddress { get; set; } = new List<RootMessageTransactionFormalTransactionAddress>();
[XmlElement(ElementName = "Header")]
public RootMessageTransactionHeader Header { get; set; } = new RootMessageTransactionHeader();
[XmlElement(ElementName = "InformalTransactionAddress")]
public List<RootMessageTransactionInformalTransactionAddress> InformalTransactionAddress { get; set; } = new List<RootMessageTransactionInformalTransactionAddress>();
[XmlElement(ElementName = "InitialTransactionMode")]
public RootMessageTransactionInitialTransactionMode InitialTransactionMode { get; set; } = new RootMessageTransactionInitialTransactionMode();
[XmlElement(ElementName = "LineOfBusinessRoutingCode")]
public RootMessageTransactionLineOfBusinessRoutingCode LineOfBusinessRoutingCode { get; set; } = new RootMessageTransactionLineOfBusinessRoutingCode();
[XmlElement(ElementName = "OriginationReferenceInformation")]
public RootMessageTransactionOriginationReferenceInformation OriginationReferenceInformation { get; set; } = new RootMessageTransactionOriginationReferenceInformation();
[XmlElement(ElementName = "PolicyTypeRoutingCode")]
public RootMessageTransactionPolicyTypeRoutingCode PolicyTypeRoutingCode { get; set; } = new RootMessageTransactionPolicyTypeRoutingCode();
[XmlElement(ElementName = "ProcessingCycleNumber")]
public RootMessageTransactionProcessingCycleNumber ProcessingCycleNumber { get; set; } = new RootMessageTransactionProcessingCycleNumber();
[XmlElement(ElementName = "ProcessingCycleStatus")]
public RootMessageTransactionProcessingCycleStatus ProcessingCycleStatus { get; set; } = new RootMessageTransactionProcessingCycleStatus();
[XmlElement(ElementName = "QuoteDate")]
public RootMessageTransactionQuoteDate QuoteDate { get; set; } = new RootMessageTransactionQuoteDate();
[XmlElement(ElementName = "ReferenceTransactionSequenceNumber")]
public RootMessageTransactionReferenceTransactionSequenceNumber ReferenceTransactionSequenceNumber { get; set; } = new RootMessageTransactionReferenceTransactionSequenceNumber();
[XmlElement(ElementName = "ResponseAutomationLevel")]
public RootMessageTransactionResponseAutomationLevel ResponseAutomationLevel { get; set; } = new RootMessageTransactionResponseAutomationLevel();
[XmlElement(ElementName = "SegmentedTransactionCounter")]
public RootMessageTransactionSegmentedTransactionCounter SegmentedTransactionCounter { get; set; } = new RootMessageTransactionSegmentedTransactionCounter();
[XmlElement(ElementName = "SegmentedTransactionTotalPieces")]
public RootMessageTransactionSegmentedTransactionTotalPieces SegmentedTransactionTotalPieces { get; set; } = new RootMessageTransactionSegmentedTransactionTotalPieces();
[XmlElement(ElementName = "SegmentLevelCode")]
public RootMessageTransactionSegmentLevelCode SegmentLevelCode { get; set; } = new RootMessageTransactionSegmentLevelCode();
[XmlElement(ElementName = "SpecialHandling")]
public RootMessageTransactionSpecialHandling SpecialHandling { get; set; } = new RootMessageTransactionSpecialHandling();
[XmlElement(ElementName = "SpecialResponseOption")]
public RootMessageTransactionSpecialResponseOption SpecialResponseOption { get; set; } = new RootMessageTransactionSpecialResponseOption();
[XmlElement(ElementName = "SynchronizationField")]
public RootMessageTransactionSynchronizationField SynchronizationField { get; set; } = new RootMessageTransactionSynchronizationField();
[XmlElement(ElementName = "TransactionCategory")]
public RootMessageTransactionTransactionCategory TransactionCategory { get; set; } = new RootMessageTransactionTransactionCategory();
[XmlElement(ElementName = "TransactionDate")]
public RootMessageTransactionTransactionDate TransactionDate { get; set; } = new RootMessageTransactionTransactionDate();
[XmlElement(ElementName = "TransactionEffectiveDate")]
public RootMessageTransactionTransactionEffectiveDate TransactionEffectiveDate { get; set; } = new RootMessageTransactionTransactionEffectiveDate();
[XmlElement(ElementName = "TransactionFunction")]
public RootMessageTransactionTransactionFunction TransactionFunction { get; set; } = new RootMessageTransactionTransactionFunction();
[XmlElement(ElementName = "TransactionImage")]
public RootMessageTransactionTransactionImage TransactionImage { get; set; } = new RootMessageTransactionTransactionImage();
[XmlElement(ElementName = "TransactionSequenceNumber")]
public RootMessageTransactionTransactionSequenceNumber TransactionSequenceNumber { get; set; } = new RootMessageTransactionTransactionSequenceNumber();
[XmlElement(ElementName = "TransactionStructureStandardVersionNumber")]
public RootMessageTransactionTransactionStructureStandardVersionNumber TransactionStructureStandardVersionNumber { get; set; } = new RootMessageTransactionTransactionStructureStandardVersionNumber();
}
public class RootMessageTransactionApplicationSoftwareRevisionLevel
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionAutomationLevel
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionCycleBusinessPurpose
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionDeletedTransactionDate
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionDeletedTransactionEffectiveDate
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionDeletedYear2000LogicCode
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionErrorProcessingOption
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionFormalTransactionAddress : IComparable<RootMessageTransactionFormalTransactionAddress>
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
public int CompareTo(RootMessageTransactionFormalTransactionAddress other)
{
//sort desc
if (String.Compare(this.InnerText, other.InnerText, StringComparison.InvariantCultureIgnoreCase) == 0)
{
return 0;
}
else if (String.Compare(this.InnerText, other.InnerText, StringComparison.InvariantCultureIgnoreCase) > 0)
{
return -1; //sort desc
}
else
{
return 1;
}
}
}
public class RootMessageTransactionHeader
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionInformalTransactionAddress : IComparable<RootMessageTransactionInformalTransactionAddress>
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
public int CompareTo(RootMessageTransactionInformalTransactionAddress other)
{
//sort desc
if (String.Compare(this.InnerText, other.InnerText, StringComparison.InvariantCultureIgnoreCase) == 0)
{
return 0;
}
else if (String.Compare(this.InnerText, other.InnerText, StringComparison.InvariantCultureIgnoreCase) > 0)
{
return -1; //sort desc
}
else
{
return 1;
}
}
}
public class RootMessageTransactionInitialTransactionMode
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionLineOfBusinessRoutingCode
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionOriginationReferenceInformation
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionPolicyTypeRoutingCode
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionProcessingCycleNumber
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionProcessingCycleStatus
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionQuoteDate
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionReferenceTransactionSequenceNumber
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionResponseAutomationLevel
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionSegmentedTransactionCounter
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionSegmentedTransactionTotalPieces
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionSegmentLevelCode
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionSpecialHandling
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionSpecialResponseOption
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionSynchronizationField
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionTransactionCategory
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionTransactionDate
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionTransactionEffectiveDate
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionTransactionFunction
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionTransactionImage
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionTransactionSequenceNumber
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
public class RootMessageTransactionTransactionStructureStandardVersionNumber
{
[XmlAttribute(AttributeName = "group_element")]
public string group_element { get; set; }
[XmlText]
public string InnerText { get; set; } = string.Empty;
}
}
创建一个类(名称:RootMessage.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace XmlSerialization6656
{
public class RootMessage
{
[XmlElement(ElementName = "Transaction")]
public RootMessageTransaction Transaction { get; set; } = new RootMessageTransaction();
}
}
创建一个类(名称:Root.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace XmlSerialization6656
{
[XmlRoot(ElementName = "Root", IsNullable = false)]
public class Root
{
[XmlElement(ElementName = "Message")]
public RootMessage Message { get; set; } = new RootMessage();
}
}
创建一个类(名称:HelperXml.cs)
注意:该类用于序列化和反序列化方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace XmlSerialization6656
{
public class HelperXml
{
public static T DeserializeXMLFileToObject<T>(string xmlFilename)
{
//Usage: Class1 myClass1 = DeserializeXMLFileToObject<Class1>(xmlFilename);
T rObject = default(T);
try
{
if (string.IsNullOrEmpty(xmlFilename))
{
return default(T);
}
using (System.IO.StreamReader xmlStream = new System.IO.StreamReader(xmlFilename))
{
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
rObject = (T)serializer.Deserialize(xmlStream);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
throw ex;
}
return rObject;
}
public static void SerializeObjectToXMLFile(object obj, string xmlFilename)
{
//Usage: Class1 myClass1 = new Class1();
//SerializeObjectToXMLFile(myClass1, xmlFilename);
try
{
if (string.IsNullOrEmpty(xmlFilename))
{
return;
}//if
System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
settings.OmitXmlDeclaration = false;
settings.Indent = true;
settings.NewLineHandling = System.Xml.NewLineHandling.Entitize;
using (System.Xml.XmlWriter xmlWriter = System.Xml.XmlWriter.Create(xmlFilename, settings))
{
//specify namespaces
System.Xml.Serialization.XmlSerializerNamespaces ns = new System.Xml.Serialization.XmlSerializerNamespaces();
ns.Add(string.Empty, "urn:none");
//create new instance
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
//write XML to file
serializer.Serialize(xmlWriter, obj, ns);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
throw ex;
}
}
}
}
用法:
//deserialize - get XML from file
Root root = HelperXml.DeserializeXMLFileToObject<Root>(xmlFilename);
//serialize - save XML to file
HelperXml.SerializeObjectToXMLFile(root, xmlFilename);
示例:
private void GetXmlData(string xmlFilename)
{
//get XML
Root root = HelperXml.DeserializeXMLFileToObject<Root>(xmlFilename);
Debug.WriteLine("Header: " + root.Message.Transaction.Header.InnerText);
//sort
root.Message.Transaction.FormalTransactionAddress.Sort();
foreach (var fta in root.Message.Transaction.FormalTransactionAddress)
{
Debug.WriteLine("FormalTransactionAddress: group_element: " + fta.group_element + " InnerText: " + fta.InnerText);
}
//sort
root.Message.Transaction.InformalTransactionAddress.Sort();
foreach (var fta in root.Message.Transaction.InformalTransactionAddress)
{
Debug.WriteLine("InformalTransactionAddress: group_element: " + fta.group_element + " InnerText: " + fta.InnerText);
}
}