比较innertext和switch与另一个innertext

时间:2015-08-01 22:04:19

标签: c# xml

伙计们我完全被这个人困住了。

基本上我的设置如下: 我正在阅读一个包含一些数据的文本文件,我从中成功提取了所需的信息。

string[] nameAnimals = new string[lines.Length];

for (int i = 0; i < lines.Length; i++)
{
nameAnimals[i] = lines[i].Substring(0, 14).TrimEnd(trimArray);
}
textBox1.Text = nameAnimals.ToString();

//textBox1 text is MonkeyElephantTigerZebra

我正在调用我的函数

readingXML(nameAnimals);

这就是宣布的方式

public void readingXML(string[] checkAnimals)

然后我正在阅读两个具有相同布局的不同XML文件,并且只在一个InnerText中有所不同。 (XML#2不包含与XML#1相同的data

<Root><!-- This is first XML -->
    <data>
        <NUMBER>1</NUMBER>
        <NAME>Monkey</NAME>
        <PRICE>1240</Price>
    </data>
<data>
        <NUMBER>2</NUMBER>
        <NAME>Tiger</NAME>
        <PRICE>2500</Price>
    </data>
<data>
        <NUMBER>3</NUMBER>
        <NAME>Elephant</NAME>
        <PRICE>4810</Price>
    </data>
<data>
        <NUMBER>4</NUMBER>
        <NAME>Zebra</NAME>
        <PRICE>5600</Price>
    </data>
</Root>



<Root><!-- This is second XML -->
        <data>
            <NUMBER>1</NUMBER>
            <NAME>Gorilla</NAME>
            <PRICE>1240</Price>
        </data>
    <data>
            <NUMBER>2</NUMBER>
            <NAME>Bengal</NAME>
            <PRICE>2500</Price>
        </data>
    </Root>
<!-- The NAME.InnerText will always be related
between these two XML's only via NUMBER.InnerText -->

现在,我想将我的字符串(我在某种程度上用string.Contains猜测)从该文本文件与XML#1的NAME.InnerText进行比较,得到它NUMBER.InnerText,搜索在XML#2中NUMBER.InnerText,从XML#2获取NAME.InnerText,然后在textBox1中显示它。 例如,如果在XML#2中找不到XML#1中的NUMBER.InnerText,那么只需从XML#1获取PRICE.InnerText。那么最后我得到字符串GorillaElephantBengalZebra

我在textBox1中的数据,理想情况下,在获得PRICE.InnerText后会是这样的,此时格式化无关紧要。

Gorilla - price 1240
Elephant - price 4810
Bengal - price 2500
Zebra - price 5600

我在我的脑海里,或许我在想这个。

此外,到目前为止,做出所需的事情似乎有点混乱吗?

我一直在谷歌搜索数天,但我没有找到解决方案。

干杯

2 个答案:

答案 0 :(得分:0)

你想要没有重复的元素,看起来你可以使用字典,只是组合元素。 使用NUMBER和整个对象作为键的键,因此您将没有重复的元素。  所以你可以创建一个这样的类:

     class myXMLAnimals {
        public myXMLAnimals(string  id)
        { NUMBER = id; }
        public string NUMBER;
        public string NAME;
        public string price;
    }

然后创建一个XML参数并通过以下元素进行交互:

    static void Main(string[] args)
    {
        string dataXML1 = "<Root><!-- This is first XML -->    <data><NUMBER>1</NUMBER><NAME>Monkey</NAME><PRICE>1240</PRICE>    </data><data><NUMBER>2</NUMBER><NAME>Tiger</NAME><PRICE>2500</PRICE>    </data><data><NUMBER>3</NUMBER><NAME>Elephant</NAME><PRICE>4810</PRICE>    </data><data><NUMBER>4</NUMBER><NAME>Zebra</NAME><PRICE>5600</PRICE>    </data></Root>";

        string dataXML2 = "<Root><!-- This is second XML --><data>    <NUMBER>1</NUMBER>    <NAME>Gorilla</NAME>    <PRICE>1240</PRICE>  </data>  <data>    <NUMBER>2</NUMBER>    <NAME>Bengal</NAME>    <PRICE>2500</PRICE></data>    </Root>";

        XDocument doc = XDocument.Parse(dataXML1);
        XDocument doc2 = XDocument.Parse(dataXML2);

        Dictionary<string, myXMLAnimals> dataDictionary = new Dictionary<string, myXMLAnimals>();

        List<XDocument> myXMLDocumentsToCompare = new List<XDocument>();
        myXMLDocumentsToCompare.Add(doc);
        myXMLDocumentsToCompare.Add(doc2);
        //You can add more documents if you need to!

        foreach (XDocument documento in myXMLDocumentsToCompare)
        {

            Console.WriteLine("New Document!");

            string lastKey = "";
            //I assume that you only have 3 elements per object, number, name and price, you have to addapt it as you need.
            foreach (XElement element in documento.Descendants().Where(p => p.HasElements == false))
            {
                string keyName = element.Name.LocalName;


                Console.WriteLine("> lastKey = " + lastKey);

                if (keyName.Equals("NUMBER"))
                {
                    lastKey = element.Value;
                    Console.WriteLine("New element!:" + lastKey);
                    if (!dataDictionary.ContainsKey(lastKey))
                    {
                        dataDictionary.Add(lastKey, new myXMLAnimals(element.Value));
                    }

                }
                else if (keyName.Equals("NAME")) // remove this if if you dontwant to replace the NAME
                {
                    dataDictionary[lastKey].NAME = element.Value;
                }
                else if (keyName.Equals("PRICE")) // remove this if if you dontwant to replace the price
                {
                    dataDictionary[lastKey].price = element.Value;
                }



                Console.WriteLine(keyName + " = " + element.Value);
            }
        }


        Console.WriteLine("THIS IS THE RESULT:");

        foreach (KeyValuePair<string, myXMLAnimals> pair in dataDictionary)
        {
            Console.WriteLine(pair.Key + " = " + pair.Value.NAME+", Price:" + pair.Value.price);
        }

       Console.Beep();
        Console.ReadKey();


    }

只是想让你知道你在那里的XML有一些错误,&#34; PRICE&#34;标签贴近&#34;价格&#34;你应该修复它以使其工作:)

结果如下:

enter image description here

请让我知道你的想法!

答案 1 :(得分:0)

LinqToXml我认为这是要走的路

var xdoc = XDocument.Load(@"c:\temp\animals.xml");
var el = xdoc.Elements().FirstOrDefault();
var datas =
    from data in el.Elements()
    select new { Number = data.Element("NUMBER").Value, Name = data.Element("NAME").Value, Price = data.Element("PRICE").Value} ;

//data it's going to be an IEnumerable<anonymous> that have the properties Number, Name, Price

对其他Xml文件执行相同操作然后您正在使用对象,我认为它会更简单..

修改

var xdoc = XDocument.Load(@"c:\temp\animals.xml");
var el = xdoc.Elements().FirstOrDefault();
var datas =
    from data in el.Elements()
    select new { Number = data.Element("NUMBER").Value, Name = data.Element("NAME").Value, Price = data.Element("PRICE").Value} ;

var xdoc2 = XDocument.Load(@"c:\temp\animals2.xml");
var el2 = xdoc2.Elements().FirstOrDefault();
var datas2 =
    from data in el2.Elements()
    select new { Number = data.Element("NUMBER").Value, Name = data.Element("NAME").Value, Price = data.Element("PRICE").Value };

var result = datas.Select(x =>
{
    var d2 = datas2.FirstOrDefault(y => y.Number == x.Number);
    if ( d2 != null)
    {
        return string.Format("{0} - price {1}", d2.Name, d2.Price);
    }
    return string.Format("{0} - price {1}", x.Name, x.Price);
});

//and result has IEnumerable<string> with the output

Gorilla - 1240
Bengal - 2500 
Elephant - 4810 
Zebra - 5600