g.bhangu Ответов: 1

Нужно прочитать элемент XML-файла и сравнить его на языке Си#


<?xml version="1.0" ?><MotePacket><ParsedDataElement><Name>amtype</Name><ConvertedValue>11</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>nodeid</Name><ConvertedValue>1</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>parent</Name><ConvertedValue>0</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>group</Name><ConvertedValue>125</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>socketid</Name><ConvertedValue>51</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>board_id</Name><ConvertedValue>132</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>packet_id</Name><ConvertedValue>129</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>voltage</Name><ConvertedValue>2636</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>temp</Name><ConvertedValue>25.519222</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>light</Name><ConvertedValue>1543</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>mic</Name><ConvertedValue>313</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>accel_x</Name><ConvertedValue>-1660.000000</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>accel_y</Name><ConvertedValue>960.000000</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>mag_x</Name><ConvertedValue>30.790493</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>mag_y</Name><ConvertedValue>30.790493</ConvertedValue></ParsedDataElement></MotePacket>

<?xml version="1.0" ?><MotePacket><ParsedDataElement><Name>amtype</Name><ConvertedValue>11</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>nodeid</Name><ConvertedValue>1</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>parent</Name><ConvertedValue>0</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>group</Name><ConvertedValue>125</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>socketid</Name><ConvertedValue>51</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>board_id</Name><ConvertedValue>132</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>packet_id</Name><ConvertedValue>129</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>voltage</Name><ConvertedValue>2614</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>temp</Name><ConvertedValue>22.881853</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>light</Name><ConvertedValue>1983</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>mic</Name><ConvertedValue>285</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>accel_x</Name><ConvertedValue>-80.000000</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>accel_y</Name><ConvertedValue>520.000000</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>mag_x</Name><ConvertedValue>30.925539</ConvertedValue></ParsedDataElement><ParsedDataElement><Name>mag_y</Name><ConvertedValue>30.790493</ConvertedValue></ParsedDataElement></MotePacket>


выше приведены два xml-файла, которые я добавил к одному. другая часть состоит в том, чтобы прочитать имя элемента "light" и его преобразованные значения. я могу прочитать одно значение света вместе с его преобразованным значением. ниже приведен код. но дальнейшая задача-сравнить значения освещенности. в приведенном выше файле есть два разных значения для света: одно-1543, а другое-1983. что я хочу, так это то, что если свет увеличит предел 1600, он должен выдать предупреждающий текст в моем текстовом поле. пожалуйста, предложите что-нибудь. это последний шаг моего проекта.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Xml.XPath;

namespace read_xml_elements
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
          
            XmlTextReader Reader = new XmlTextReader("C:\\Memsic\\cygwin\\home\\admin\\22.xml");
            XmlDocument doc = new XmlDocument();
            doc.Load(Reader);
            XPathNavigator nav = doc.CreateNavigator();
            
            //compile xpath 
             XPathExpression expr;

             expr = nav.Compile("/MotePacket/ParsedDataElement/[Name='light']");
            
             XPathNodeIterator iterator = nav.Select(expr);

            //iterate node set
            listBox1.Items.Clear();
            try
            {
                while (iterator.MoveNext())
                {
                    XPathNavigator nav2 = iterator.Current.Clone();
                    listBox1.Items.Add("Name: " + nav2.Value);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            
        }
    }
}

George Swan

Когда вы объединили два xml-файла, вы продублировали оператор объявления и корневой элемент. Я предлагаю вам исправить это, удалив второй оператор объявления и добавив новый корневой элемент. Затем XPathExpression ". //ParsedDataElement [Name= 'light'] " должен позволить вам извлечь значения light.

g.bhangu

@George, я пробовал этот способ, и я знаю, что он работает только таким образом, но проблема в том, что я не могу объединить два xml-файла в один. поэтому я взял и загрузил два xml-файла в один, добавив его. поэтому, наконец, когда я открываю этот недавно сохраненный файл, он также берет корневые элементы и деклерации. итак, есть ли идея, как объединить два разных xmls, имеющих один и тот же корень и declearations в одном, который просто добавляет только элементы?

1 Ответов

Рейтинг:
7

RickZeeland

Что-то вроде этого:

using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
...

XElement _x = XElement.Load(@"22.xml");

	var lightElements = from page in _x.Elements("ParsedDataElement")
			where page.Element("Name").Value == "light"
			select page;

	foreach (var item in lightElements)
	{
		listBox1.Items.Add(item.Element("ConvertedValue").Value);
	}