C# XML将其解析为集合对象
感谢MikeH,我能够将以下XML解析为一个对象 当我将XML文件解析为对象时,它只将最后一行填充到对象中。如何将所有行解析为集合对象。行应填充到集合中。在这种情况下,所有5条记录都应该在集合中,而不仅仅是最后一条记录()。我花了一天的大部分时间,在如何将所有行放入对象中的问题上,我肯定遗漏了一些东西C# XML将其解析为集合对象,c#,asp.net,xml,parsing,object,C#,Asp.net,Xml,Parsing,Object,感谢MikeH,我能够将以下XML解析为一个对象 当我将XML文件解析为对象时,它只将最后一行填充到对象中。如何将所有行解析为集合对象。行应填充到集合中。在这种情况下,所有5条记录都应该在集合中,而不仅仅是最后一条记录()。我花了一天的大部分时间,在如何将所有行放入对象中的问题上,我肯定遗漏了一些东西 - <ROW> <CELL INDEX="0">033331111</CELL> <CELL INDEX="1">Agency
- <ROW>
<CELL INDEX="0">033331111</CELL>
<CELL INDEX="1">Agency 5 LTD</CELL>
<CELL INDEX="2">14 Some AVENUE North Brook, FL 65432 3827</CELL>
<CELL INDEX="3">A</CELL>
<CELL INDEX="4">4412034564</CELL>
<CELL INDEX="5" />
<CELL INDEX="6">A - Active</CELL>
<CELL INDEX="7">6/1/2008 12:00:00 AM</CELL>
</ROW>
-
033331111
代理5有限公司
佛罗里达州北布鲁克大道14号,邮编65432 3827
A.
4412034564
A-主动
2008年6月1日12:00:00上午
使用Visual Studio 2012或更高版本:
将XML复制到剪贴板
在Visual Studio中:编辑-->粘贴特殊-->将XML粘贴为类
然后,需要将数据从XML序列化到新创建的类,以创建新对象:
var myObject = LoadFromXmlString<DATA_PROVIDERS>(xmlData);
public static T LoadFromXmlString<T>(string xml)
{
T retval = default(T);
try
{
XmlSerializer s = new XmlSerializer(typeof(T));
MemoryStream ms = new MemoryStream(ASCIIEncoding.Default.GetBytes(xml));
retval = (T)s.Deserialize(ms);
ms.Close();
}
catch (Exception ex)
{
ex.Data.Add("Xml String", xml);
throw new Exception("Error loading from XML string. See data.", ex);
}
return retval;
}
<?xml version="1.0" encoding="UTF-8" ?>
-<DATA_PROVIDERS UID="Providers|REP" FORCE_REFRESH="FALSE" DATA_PROVIDER="" FORMATTED="FALSE" REFRESH="TRUE">
-<DATA_PROVIDER NAME="Prov" SOURCE="Provider" DATE="11/18/2014" DURATION="9s" REFRESH="TRUE" CUBE="1">
<COLUMN INDEX="0" ID="119" TYPE="String" FORMAT="">Prov ID</COLUMN>
<COLUMN INDEX="1" ID="118" TYPE="String" FORMAT="">Prov Name</COLUMN>
<COLUMN INDEX="2" ID="113" TYPE="String" FORMAT="">Address Info</COLUMN>
<COLUMN INDEX="3" ID="110" TYPE="String" FORMAT="">Enroll Status Code</COLUMN>
<COLUMN INDEX="4" ID="119" TYPE="String" FORMAT="">Phone</COLUMN>
<COLUMN INDEX="5" ID="110" TYPE="String" FORMAT="">Fax</COLUMN>
<COLUMN INDEX="6" ID="109" TYPE="String" FORMAT="">Provider Status</COLUMN>
<COLUMN INDEX="7" ID="150" TYPE="Date" FORMAT="m/d/yyyy h:mm:ss am/pm">Provider Start Date</COLUMN>
- <ROW>
<CELL INDEX="0">004042111</CELL>
<CELL INDEX="1">CONTOSO West INC</CELL>
<CELL INDEX="2">1234 Random Rd. SOMECITY, ZZ 12345 9876</CELL>
<CELL INDEX="3">F</CELL>
<CELL INDEX="4">5555551234123</CELL>
<CELL INDEX="5">5555551234</CELL>
<CELL INDEX="6">F - Agency Action</CELL>
<CELL INDEX="7">5/31/2011 12:00:00 AM</CELL>
</ROW>
- <ROW>
<CELL INDEX="0">004011117</CELL>
<CELL INDEX="1">CONTOSO North INC</CELL>
<CELL INDEX="2">4321 Random Rd. SOMECITY, ZZ 12345 9876</CELL>
<CELL INDEX="3">F</CELL>
<CELL INDEX="4">5555551234123</CELL>
<CELL INDEX="5">5555551234</CELL>
<CELL INDEX="6">F - Agency Action</CELL>
<CELL INDEX="7">5/31/2011 12:00:00 AM</CELL>
</ROW>
- <ROW>
<CELL INDEX="0">033337111</CELL>
<CELL INDEX="1">Agency 3 INC</CELL>
<CELL INDEX="2">200 street 5F Cityabc, NY 12033</CELL>
<CELL INDEX="3">A</CELL>
<CELL INDEX="4">2128545555</CELL>
<CELL INDEX="5" />
<CELL INDEX="6">A - Active</CELL>
<CELL INDEX="7">10/27/2003 12:00:00 AM</CELL>
</ROW>
- <ROW>
<CELL INDEX="0">033334111</CELL>
<CELL INDEX="1">Agency 4 LLC</CELL>
<CELL INDEX="2">419 street Town, CT 17033 3945</CELL>
<CELL INDEX="3">U</CELL>
<CELL INDEX="4" />
<CELL INDEX="5">7172304056</CELL>
<CELL INDEX="6">X - Did Not Re-enroll</CELL>
<CELL INDEX="7">2/24/2009 12:00:00 AM</CELL>
</ROW>
- <ROW>
<CELL INDEX="0">033331111</CELL>
<CELL INDEX="1">Agency 5 LTD</CELL>
<CELL INDEX="2">14 Some AVENUE North Brook, FL 65432 3827</CELL>
<CELL INDEX="3">A</CELL>
<CELL INDEX="4">4412034564</CELL>
<CELL INDEX="5" />
<CELL INDEX="6">A - Active</CELL>
<CELL INDEX="7">6/1/2008 12:00:00 AM</CELL>
</ROW>
</DATA_PROVIDER>
</DATA_PROVIDERS>
var myObject=LoadFromXmlString(xmlData);
公共静态T LoadFromXmlString(字符串xml)
{
T retval=默认值(T);
尝试
{
XmlSerializer s=新的XmlSerializer(typeof(T));
MemoryStream ms=新的MemoryStream(ascienceoding.Default.GetBytes(xml));
retval=(T)s.反序列化(ms);
Close女士();
}
捕获(例外情况除外)
{
添加(“Xml字符串”,Xml);
抛出新异常(“从XML字符串加载时出错。请参阅数据。”,ex);
}
返回返回;
}
-
-
Prov ID
Prov名称
地址信息
注册状态代码
电话
传真
提供者状态
提供者开始日期
-
004042111
康托索西部公司
ZZ某市随机路1234号123459876
F
5555551234123
5555551234
F-机构行动
2011年5月31日12:00:00上午
-
004011117
康托索北方公司
ZZ 123459876某市随机路4321号
F
5555551234123
5555551234
F-机构行动
2011年5月31日12:00:00上午
-
033337111
代理3公司
纽约州亚伯克市5楼200街12033
A.
2128545555
A-主动
2003年10月27日上午12:00:00
-
033334111
代理4有限责任公司
CT 17033 3945镇419街
U
7172304056
X-未重新注册
2009年2月24日12:00:00上午
-
033331111
代理5有限公司
佛罗里达州北布鲁克大道14号,邮编65432 3827
A.
4412034564
A-主动
2008年6月1日12:00:00上午
您需要做的是使用属性标记单元格
集合,以通知XmlSerializer
集合应序列化为同名元素序列,而不是具有嵌套子元素的单个元素,如下所示:
public class Cell
{
[XmlText]
public string Text { get; set; }
[XmlAttribute("INDEX")]
public int Index { get; set; }
}
[XmlRoot("ROW")]
public class Row
{
[XmlElement("CELL")]
public List<Cell> Cells { get; set; }
}
public class Cell
{
public Cell() {}
public Cell(Cell other)
{
this.Text = other.Text;
}
[XmlText]
public string Text { get; set; }
}
public class XmlCell : Cell // For serialization
{
public XmlCell() : base() {}
public XmlCell(Cell other, int index) : base(other)
{
this.Index = index;
}
[XmlAttribute("INDEX")]
public int Index { get; set; }
}
[XmlRoot("ROW")]
public class Row
{
List<Cell> cells;
[XmlIgnore]
public List<Cell> Cells
{
get
{
if (cells == null)
Interlocked.CompareExchange(ref cells, new List<Cell>(), null);
return cells;
}
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[XmlElement("CELL")]
public XmlCell[] XmlCells // proxy array for serialization.
{
get
{
var xmlCells = new XmlCell[Cells.Count];
for (int iCell = 0; iCell < xmlCells.Length; iCell++)
xmlCells[iCell] = new XmlCell(Cells[iCell], iCell);
return xmlCells;
}
set
{
Cells.Clear();
foreach (var xmlCell in value)
{
Cells.EnsureCount(xmlCell.Index + 1);
Cells[xmlCell.Index] = new Cell(xmlCell);
}
}
}
}
最后,有两种扩展方法:
public static class ListExtensions
{
public static void Resize<T>(this List<T> list, int count)
{
if (list == null || count < 0)
throw new ArgumentException();
int oldCount = list.Count;
if (count > oldCount)
{
list.Capacity = count;
for (int i = oldCount; i < count; i++)
list.Add(default(T));
}
else if (count < oldCount)
{
for (int i = oldCount - 1; i >= count; i--)
list.RemoveAt(i);
}
}
public static void EnsureCount<T>(this List<T> list, int count)
{
if (list == null || count < 0)
throw new ArgumentException();
if (count > list.Count)
list.Resize(count);
}
}
公共静态类ListExtensions
{
公共静态void Resize(此列表,整数计数)
{
if(list==null | | count<0)
抛出新ArgumentException();
int oldCount=list.Count;
如果(计数>旧计数)
{
列表容量=计数;
for(int i=oldCount;i=count;i--)
列表。删除(i);
}
}
公共静态重新计数(此列表,整数计数)
{
if(list==null | | count<0)
抛出新ArgumentException();
如果(计数>列表计数)
列表。调整大小(计数);
}
}