[英]Deserialize two separate objects from one XML file
我將兩個對象序列化為XML,然后寫入兩個單獨的XML文件,然后將兩個文件合並為一個文件。 我想做的是能夠從合並文件中單獨反序列化每個對象。
<?xml version="1.0" encoding="utf-8"?>
<root>
<ArrayOfMapItem>
<MapItem>
<EpgId xmlns="Company.Domain.Name.Space">0000DAC2-0000-0000-0000-000000000000</EpgId>
<MapId xmlns="Company.Domain.Name.Space">5D195A5B-FBBF-4042-8AB3-E4558CA1D347</MapId>
<ServiceCollectionId xmlns="Company.Domain.Name.Space">657A62F8-260A-482B-BC86-7D6DEA9D8984</ServiceCollectionId>
<ServiceCollectionName xmlns="Company.Domain.Name.Space">Rich_Gold</ServiceCollectionName>
<Services xmlns="Company.Domain.Name.Space">Rich_Gold</Services>
<TunerPosition xmlns="Company.Domain.Name.Space">1</TunerPosition>
</MapItem>
<MapItem>
<EpgId xmlns="Company.Domain.Name.Space">000010FA-0000-0000-0000-000000000000</EpgId>
<MapId xmlns="Company.Domain.Name.Space">5DF26284-D0EA-4071-9DA0-22E463314D65</MapId>
<ServiceCollectionId xmlns="Company.Domain.Name.Space">83CFD40E-C7FB-420D-B9FC-5E5B711B9E74</ServiceCollectionId>
<ServiceCollectionName xmlns="Company.Domain.Name.Space">G-D9154-DF8-01_SC</ServiceCollectionName>
<Services xmlns="Company.Domain.Name.Space">G-D9154-DF8-PIP-01, G-D9154-DF8-FS-01</Services>
<TunerPosition xmlns="Company.Domain.Name.Space">2</TunerPosition>
</MapItem>
<ArrayOfMapItem>
<ArrayOfArrayOfGrant>
<ArrayOfGrant>
<Grant ResourceId="5df26284-d0ea-4071-9da0-22e463314d65" PrincipalExternalId="roman" PrincipalType="Group" ResType="Package" Right="Record">
<Conditions xmlns="http://www.company.com/egtv/bss">
<TimeExpiration Start="2014-05-01T07:00:00" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" />
</Conditions>
</Grant>
<Grant ResourceId="5df26284-d0ea-4071-9da0-22e463314d65" PrincipalExternalId="PETSIN" PrincipalType="Group" ResType="Package" Right="Record">
<Conditions xmlns="http://www.company.com/egtv/bss">
<TimeExpiration Start="2014-04-04T18:52:24.867" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" />
</Conditions>
</Grant>
<Grant ResourceId="5df26284-d0ea-4071-9da0-22e463314d65" PrincipalExternalId="PETSIN" PrincipalType="Group" ResType="Package" Right="Record">
<Conditions xmlns="http://www.company.com/egtv/bss">
<TimeExpiration Start="2014-04-04T18:53:28.797" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" />
</Conditions>
</Grant>
<Grant ResourceId="5df26284-d0ea-4071-9da0-22e463314d65" PrincipalExternalId="PETSIN" PrincipalType="Group" ResType="Package" Right="Record">
<Conditions xmlns="http://www.company.com/egtv/bss">
<TimeExpiration Start="2014-04-04T19:17:42.983" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" />
</Conditions>
</Grant>
</ArrayOfGrant>
<ArrayOfGrant>
<Grant ResourceId="6f26ecfd-4bfe-4c5d-af0b-164a93f448e8" PrincipalExternalId="roman" PrincipalType="Group" ResType="Package" Right="Record">
<Conditions xmlns="http://www.company.com/egtv/bss">
<TimeExpiration Start="2014-05-01T07:00:00" End="9999-12-31T23:59:59.997" Type="TimeExpiration" Expiration="9999-12-31T23:59:59" />
</Conditions>
</Grant>
</ArrayOfGrant>
</ArrayOfArrayOfGrant>
</root>
我已經試過了:
XmlSerializer mySerializer = new XmlSerializer(typeof(MapItem[]), new XmlRootAttribute("ArrayOfMapItem"));
using (FileStream fs = new FileStream("DataMerged.xml", FileMode.Open))
{
MapItem[] r;
r = (MapItem[]) mySerializer.Deserialize(fs);
.....
}
但是,當代碼進入“ mySerializer.Deserialize”時,它將得到:
InnerException: System.InvalidOperationException
HResult=-2146233079
Message=<root xmlns=''> was not expected.
Source=Microsoft.GeneratedCode
StackTrace:
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderChannelMapItemArray.Read3_ArrayOfChannelMapItem()
有沒有一種方法可以從一個合並的文件中分別反序列化對象? 當我反序列化對象時,它們仍位於單獨的文件中,我沒有問題。
感謝您提供任何幫助
一種簡單的方法是將XML加載到XDocument
,選擇每個部分,然后使用現有的序列化代碼分別對每個部分進行反序列化。
首先,一些擴展方法:
public static class XObjectExtensions
{
public static T Deserialize<T>(this XElement element)
{
return element.Deserialize<T>(new XmlSerializer(typeof(T)));
}
public static T Deserialize<T>(this XElement element, XmlSerializer serial)
{
using (var reader = element.CreateReader())
{
object result = serial.Deserialize(reader);
if (result is T)
return (T)result;
}
return default(T);
}
}
然后做:
var xml = GetXml(); // Load the XML. (In my test code it's just a string literal.)
var doc = XDocument.Parse(xml); // In your case, you would use XDocument.Load(filename)
var mapXml = doc.Root.Element("ArrayOfMapItem");
var grantXml = doc.Root.Element("ArrayOfArrayOfGrant");
if (mapXml != null)
{
var mapItems = mapXml.Deserialize<MapItem[]>();
Debug.WriteLine(mapItems.GetXml()); // Two items deserialized successfully.
}
if (grantXml != null)
{
var grantItems = grantXml.Deserialize<Grant[][]>();
Debug.WriteLine(grantItems.GetXml()); // Two arrays of arrays deserialized successfully.
}
為了進行測試,我使用了以下縮寫類:
[XmlType("MapItem", Namespace="")]
public class MapItem
{
[XmlElement(Namespace="Company.Domain.Name.Space")]
public string EpgId { get; set; }
}
[XmlType("Grant", Namespace="")]
public class Grant
{
[XmlAttribute("ResourceId")]
public string ResourceId { get; set; }
[XmlAttribute("PrincipalExternalId")]
public string PrincipalExternalId { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.