Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > помогите с XML


Автор: VisMaster 19.3.2008, 17:40
Здравствуйте.

Вот кусок XML:
Код

<Group><Title>Network</Title><Icon>34</Icon>
<Item><Title>Primary IP Address</Title><Icon>18</Icon><ID>538</ID><Value>127.0.0.1</Value></Item>
<Item><Title>Primary MAC Address</Title><Icon>18</Icon><ID>539</ID><Value>00-0A-E4-ED-06-F1</Value></Item>
<Item><Title>Network Adapter</Title><Icon>18</Icon><ID>534</ID><Value>Realtek RTL8169/8110 Family Gigabit Ethernet NIC</Value></Item>
<Item><Title>Network Adapter</Title><Icon>219</Icon><ID>534</ID><Value>Сетевой адаптер Broadcom 802.11g</Value></Item>
<Item><Title>Modem</Title><Icon>14</Icon><ID>535</ID><Value>SoftV90 Data Fax Modem with SmartCP</Value></Item>
</Group>


как мне выбрать отсюда "Realtek RTL8169/8110 Family Gigabit Ethernet NIC"??

Извиняюсь конечно, но с xml не работал, так что лучше с примером...

Заранее благодарен.

Автор: alexey___ 19.3.2008, 21:33
Вот примерчик

Код

private void button1_Click(object sender, EventArgs e)
{
            string xmlDocument = @"
<Group><Title>Network</Title><Icon>34</Icon>
<Item><Title>Primary IP Address</Title><Icon>18</Icon><ID>538</ID><Value>127.0.0.1</Value></Item>
<Item><Title>Primary MAC Address</Title><Icon>18</Icon><ID>539</ID><Value>00-0A-E4-ED-06-F1</Value></Item>
<Item><Title>Network Adapter</Title><Icon>18</Icon><ID>534</ID><Value>Realtek RTL8169/8110 Family Gigabit Ethernet NIC</Value></Item>
<Item><Title>Network Adapter</Title><Icon>219</Icon><ID>534</ID><Value>Сетевой адаптер Broadcom 802.11g</Value></Item>
<Item><Title>Modem</Title><Icon>14</Icon><ID>535</ID><Value>SoftV90 Data Fax Modem with SmartCP</Value></Item>
</Group>
                                    ";

            System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
            xml.LoadXml(xmlDocument);

            System.Xml.XmlNode node = xml.DocumentElement;
            System.Xml.XmlNodeList xn = node.SelectNodes("Item/Value");

            for (int i = 0; i < xn.Count; i++)
                listBox1.Items.Add(xn[i].InnerText);
}


а вообще вариантов много...

Автор: alexey___ 19.3.2008, 22:09
вот ещё примерчик

Код

            System.Xml.Linq.XDocument loaded = System.Xml.Linq.XDocument.Load(@"C:\test\linq.xml");
            var q = from c in loaded.Descendants("Value")
                    where c.Value == "Realtek RTL8169/8110 Family Gigabit Ethernet NIC"
                    select c;

            foreach (string nam in q)
                listBox1.Items.Add(nam);

Автор: Rififi 20.3.2008, 01:01
VisMaster
изучай XPath, оно рулез.
Например чтобы выбрать все устройства класса "Сетевой адаптер", можно сделать так:

Код

// ... остальной код см. выше
XmlNodeList xn = node.SelectNodes("/Group/Item/Title[text()='Network Adapter']/following-sibling::Value/text()");
for (int i = 0; i < xn.Count; i++)
                listBox1.Items.Add(xn[i].NodeValue);

Автор: VisMaster 20.3.2008, 22:02
Rififi 

Спасибо за примеры,может у вас есть ссылки на полезные статьи по XPath??? Буду очень благодарен их получить...

А если мне надо (если использовать прошлый пример кода XML) выбрать все значения из всех Item, которые находяться в группе Network??? Пытался так: 
Код

string xmlDocument = @"
<Group><Title>Network</Title><Icon>34</Icon>
<Item><Title>Primary IP Address</Title><Icon>18</Icon><ID>538</ID><Value>127.0.0.1</Value></Item>
<Item><Title>Primary MAC Address</Title><Icon>18</Icon><ID>539</ID><Value>00-0A-E4-ED-06-F1</Value></Item>
<Item><Title>Network Adapter</Title><Icon>18</Icon><ID>534</ID><Value>Realtek RTL8169/8110 Family Gigabit Ethernet NIC</Value></Item>
<Item><Title>Network Adapter</Title><Icon>219</Icon><ID>534</ID><Value>Сетевой адаптер Broadcom 802.11g</Value></Item>
<Item><Title>Modem</Title><Icon>14</Icon><ID>535</ID><Value>SoftV90 Data Fax Modem with SmartCP</Value></Item>
</Group>
                                    ";

            System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
            xml.LoadXml(xmlDocument);

            System.Xml.XmlNode node = xml.DocumentElement;
            XmlNodeList xn = node.SelectNodes("/Group/Title[text()='Network']/Item/following-sibling::Value/text()");
            for (int i = 0; i < xn.Count; i++)
                Console.WriteLine( xn[i].Value);

но не получается... smile 

Автор: jaros 21.3.2008, 17:06
Цитата

А если мне надо выбрать все значения из всех Item, которые находяться в группе Network???

Попробуй такой XPath:
/Group[Title/text()='Network']/Item/Value
первая ссылка на XPath из гугла: http://www.w3schools.com/xpath

Автор: Rififi 21.3.2008, 22:52
VisMaster
много чего интересного можно найти тут: http://www.isbnonline.com/?q=xpath
некоторые из них вышли на русском

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)