伙计们我完全被这个人困住了。
基本上我的设置如下: 我正在阅读一个包含一些数据的文本文件,我从中成功提取了所需的信息。
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
我在我的脑海里,或许我在想这个。
此外,到目前为止,做出所需的事情似乎有点混乱吗?
我一直在谷歌搜索数天,但我没有找到解决方案。
干杯
答案 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;你应该修复它以使其工作:)
结果如下:
请让我知道你的想法!
答案 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