Чтение XML на C # - захват определенного элемента

Я читаю XML и показываю его в DataGridView, который отлично работает.

Однако моя жизнь была бы в 10 раз проще, если бы я мог брать определенные элементы и читать их содержимое. (Я использую XmlReader)

Кроме того, есть ли простой способ перебрать элемент? Мне нужно получить счетчик, а затем перебрать каждую «установку», но я не могу заставить ее работать должным образом. Добавление еще одной строки «Пока (читал)» не было отличным решением.

Я бы предпочел не переключаться на другого читателя сейчас, я сейчас очень глубоко разбираюсь в этом.

Данные XML:

    <data>
    <count>2</count>
    <facility>
        <typeId>1</typeId>
        <type>Beds</type>
        <quantity>0</quantity>
        <description>null</description>
    </facility>
    <facility>
        <typeId>2</typeId>
        <type>EDBeds</type>
        <quantity>0</quantity>
        <description>null</description>
    </facility>
</data>

Код:

while (xr.Read())
{
    if (xr.Name.Equals("count"))
    {
        valueName.Text = "We currently have " + xr.ReadElementContentAsString() + " facilities open.";
    }
    while (xr.ReadToFollowing("facility"))
    {
        //Add a new row for data if we are at a new Facility element
        if (xr.NodeType == XmlNodeType.Element && xr.Name == "facility")
        {
            row = generalData.Rows.Add();
            col = 0;
        }
        //Loop through current facility Element
    }
}

person Nihat    schedule 16.12.2015    source источник


Ответы (3)


См. Это сообщение, почему вам следует предпочесть XDocument XmlReader. В нем говорится, что API для XDocument намного проще и поддерживает «LINQ To XML». XmlReader устарел, так как он устарел и содержит ошибки.

var xml = @"
<data>
    <count>2</count>
    <facility>
        <typeId>1</typeId>
        <type>Beds</type>
        <quantity>0</quantity>
        <description>null</description>
    </facility>
    <facility>
        <typeId>2</typeId>
        <type>EDBeds</type>
        <quantity>0</quantity>
        <description>null</description>
    </facility>
</data>";

var xDocument = XDocument.Load( new StringReader( xml ) );
var facilityElements = xDocument.Descendants().Where( x => x.Name == "facility" );

// Count the elements
var count = facilityElements.Count();

foreach ( var facilityElement in facilityElements )
{
    // Handle elements
}

// Adds an facility element
var facility = new XElement( "facility" );
var typeId = new XElement( "typeId" );
typeId.SetValue(3);
facility.Add( typeId );
xDocument.Element( "data" ).Add( facility );
person Sievajet    schedule 16.12.2015
comment
Я полностью согласен, если кто-то увидит этот вопрос, я настоятельно рекомендую использовать другой ридер. С XmlReader было немного хлопот. - person Nihat; 17.12.2015

Для данных XML нам не нужно перебирать все элементы «объекта», чтобы привязать их данные к DataGridView.

Вместо этого мы могли бы выполнить следующие простые шаги:

DataSet ds = new DataSet();
ds.ReadXml(xr);
dataGridView1.DataSource = ds.Tables["facility"];

--SJ

person codeninja.sj    schedule 17.12.2015
comment
Фантастика! Это будет делать - person Nihat; 17.12.2015

Рискнул, используя "ReadSubTree ()" для этого хорошо:

                    XmlReader inner = xr.ReadSubtree();
                    while (inner.Read())
                    {
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                             //Do stuff
                        }
                    }
person Nihat    schedule 16.12.2015