C #, XML - загрузка одного файла XML в два отдельных набора данных на основе параметра - PullRequest
0 голосов
/ 14 октября 2011

Мне нужно загрузить данные XML в два отдельных набора данных на основе заданного параметра в XML.Данные возвращаются мне через вызов SOAP.

Вот очень упрощенный пример XML:

<![CDATA[<?xml version="1.0" encoding="utf-16"?>

<ArrayOfUser xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<User>
    <ID>111-111-111</ID
    <Name>John Smith</Name>
    <Active>0</Active>
</User>

<User>
    <ID>111-111-222</ID
    <Name>Bob Smith</Name>
    <Active>0</Active>
</User>

<User>
    <ID>111-111-333</ID
    <Name>Sally Smith</Name>
    <Active>1</Active>
</User>


</ArrayOfUser>]]>

Сейчас я загружаю все в один набор данных как таковой:

XmlDocument UsersXmlDoc= new XmlDocument();
UsersXmlDoc.LoadXml(GetUsersResponse.Fetch_Result);
XmlReader UsersXmlReader= new XmlNodeReader(UsersXmlDoc);

DataSet ds = new DataSet();
ds.ReadXml(UsersXmlReader);

Вместо этого я хотел бы разделить эту информацию на два набора данных на основе свойства Active каждого пользователя, чтобы один набор данных содержал активные использования, а другой - неактивных пользователей.

1 Ответ

1 голос
/ 14 октября 2011

Я сделал пример, как ты можешь делать то, что хочешь.Может быть, код не очень хороший, но я думаю, что он должен работать.Основная идея состоит в том, чтобы скопировать текущий набор данных и удалить активные записи из первой и неактивные записи из второго набора данных.

DataSet dsActive = new DataSet();
dsActive.ReadXml(UsersXmlReader);

DataSet dsInactive = ds.Copy();//Copy to your another dataset
Remove(dsActive.Tables[0], "0");//Remove all inactive(where Active = 0) records from dsActive DataSet
Remove(dsInactive.Tables[0], "1");//Remove all active(where Active = 1) records from dsInactive DataSet

private void Remove(DataTable table, string active)
{
    for (int i = 0; i < table.Rows.Count; i++)
    {
        if (table.Rows[i]["Active"].Equals(active))
        {
            table.Rows[i].Delete();
            i = i - 1;//Removed record so we need to check same index
        }
    }
}
...