C# C读取标记内部的XML(内部?)
好的,我在读取我公司一个臭名昭著的格式错误的xml文件时遇到了一个小问题 尝试从中获取5个值,并将它们单独保存为变量 下面是一个棘手的XML示例。 我可能没有使用正确的术语,但在读取此类值时找不到任何内容C# C读取标记内部的XML(内部?),c#,xml,winforms,linq-to-xml,xelement,C#,Xml,Winforms,Linq To Xml,Xelement,好的,我在读取我公司一个臭名昭著的格式错误的xml文件时遇到了一个小问题 尝试从中获取5个值,并将它们单独保存为变量 下面是一个棘手的XML示例。 我可能没有使用正确的术语,但在读取此类值时找不到任何内容 <ONE> <TWO> <THREE> </THREE> </TWO> <DATA internalid="1" externalid="2" lastname="lname" fir
<ONE>
<TWO>
<THREE>
</THREE>
</TWO>
<DATA internalid="1" externalid="2" lastname="lname" firstname="name" date="20.03.2003"/>
</ONE>
我无法让它飞起来。并不是说我得到了任何错误,但当我把这个字符串输出到richtextbox或只是textbox时,我得到了这个
System.Linq.Enumerable+Where SelectEnumerableInterator2[System.Xml.Linq.XElement,f_uAnonymousType05[System.String,System.String,System.String,System.String,System.String]]
而且,我可以更好地研究这个问题,当数据像这样在标记中时,它叫什么
谢谢大家 正如@Jon Skeet提到的,您正在调用序列上的ToString。下面的代码可能会使您更接近所需的解决方案
var xmlList = (from message in xmlElement.Elements("DATA")
select new
{
internalid = message.Attribute("internalid").Value,
externalid = message.Attribute("externalid").Value,
lastname = message.Attribute("lastname").Value,
firstname = message.Attribute("firstname").Value,
date = message.Attribute("date").Value
});
StringBuilder builder = new StringBuilder();
foreach (var item in xmlList)
{
builder.Append(item);
}
string test = builder.ToString();
至于你关于数据的问题就在这样的标签里。这些都是成功的例子
这里有一个开始学习linq的好资源。读取数据并保存到变量的方式没有问题。要显示数据,不要尝试将xmlList对象转换为字符串,只需迭代列表以输出数据
string xml = (@"C:\1.xml");
var xmlElement = XElement.Load(xml);
var xmlList = (from message in xmlElement.Elements("DATA")
select new
{
internalid = message.Attribute("internalid").Value,
externalid = message.Attribute("externalid").Value,
lastname = message.Attribute("lastname").Value,
firstname = message.Attribute("firstname").Value,
date = message.Attribute("date").Value
});
StringBuilder outputString = new StringBuilder();
foreach (var xmlRecord in xmlList)
{
string outputRecord =
string.Format("internalid: {0}, externalid: {1}, lastname: {2}, firstname: {3}, date: {4}",
xmlRecord.internalid.ToString(), xmlRecord.externalid.ToString(),
xmlRecord.lastname.ToString(), xmlRecord.firstname.ToString(),
xmlRecord.date.ToString());
outputString.AppendLine(outputRecord);
}
Console.WriteLine(outputString.ToString());
Console.ReadLine();
嗯,是的,你在序列上调用ToString。你期望结果是什么?为什么?在我看来,这根本不是XML问题。此外,请在POST中更加注意代码的格式-不需要所有缩进。您应该将方法ToString直接应用于XElement对象,或者创建自定义类型,而不是使用匿名类重写ToString。但无论如何,您将得到可枚举的linq查询输出。您可以应用类似String.JoinlinqResult.Selectx=>x.ToString的内容。现在,将ToString切换为ToList。。。。从中得到了很好的输出。它是有效的。现在正致力于将这个列表转换成单个字符串或变量……Jon Skeet,这不是很有建设性,也不是很有必要。警告一个新成员使用这样的方法也是不好的。我们都能读。谁在乎为了清晰而进行一些编辑?
string xml = (@"C:\1.xml");
var xmlElement = XElement.Load(xml);
var xmlList = (from message in xmlElement.Elements("DATA")
select new
{
internalid = message.Attribute("internalid").Value,
externalid = message.Attribute("externalid").Value,
lastname = message.Attribute("lastname").Value,
firstname = message.Attribute("firstname").Value,
date = message.Attribute("date").Value
});
StringBuilder outputString = new StringBuilder();
foreach (var xmlRecord in xmlList)
{
string outputRecord =
string.Format("internalid: {0}, externalid: {1}, lastname: {2}, firstname: {3}, date: {4}",
xmlRecord.internalid.ToString(), xmlRecord.externalid.ToString(),
xmlRecord.lastname.ToString(), xmlRecord.firstname.ToString(),
xmlRecord.date.ToString());
outputString.AppendLine(outputRecord);
}
Console.WriteLine(outputString.ToString());
Console.ReadLine();