Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML将其解析为集合对象_C#_Asp.net_Xml_Parsing_Object - Fatal编程技术网

C# XML将其解析为集合对象

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

感谢MikeH,我能够将以下XML解析为一个对象

当我将XML文件解析为对象时,它只将最后一行填充到对象中。如何将所有行解析为集合对象。行应填充到集合中。在这种情况下,所有5条记录都应该在集合中,而不仅仅是最后一条记录()。我花了一天的大部分时间,在如何将所有行放入对象中的问题上,我肯定遗漏了一些东西

  - <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();
如果(计数>列表计数)
列表。调整大小(计数);
}
}