2014-07-23 88 views
0

好吧,我有一个小问题,阅读我公司的臭名昭着的畸形XML文件之一。C#读取标签内部的XML(内部?)

尝试从中获取5个值并将它们单独保存为变量。

下面是一个棘手的XML示例。
(我可能没有使用正确的术语,但我无法找到这种类型的阅读价值的任何东西)

<ONE> 
    <TWO> 
     <THREE> 
     </THREE> 
    </TWO> 
    <DATA internalid="1" externalid="2" lastname="lname" firstname="name" date="20.03.2003"/> 
</ONE> 

所以,我需要的数据是internalid,外部ID,姓氏,名字和日期。

到目前为止,我一直在努力工作,无法做出任何事情。

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 
       }).ToString(); 

而且我无法让它飞起来。这并不是说我得到任何错误,但是当我走出这个字符串到一个RichTextBox或只是文本我得到这个....

System.Linq.Enumerable + WhereSelectEnumerableIterator 2[System.Xml.Linq.XElement,<>f__AnonymousType0 5 System.String,系统。字符串,System.String,System.String,System.String]]

此外,所以我可以更好地研究这个问题,当数据是INSIDE标签时,它是什么叫做?

谢谢你们!

+1

嗯,是的,你在序列上调用'ToString()'。你期望结果是什么,为什么?这对我来说完全不像一个XML问题。此外,请更多关注帖子中代码的格式 - 不需要所有缩进。 –

+1

您应该将方法'ToString()'直接应用于XElement对象,或者创建自定义类型,而不是使用带有overriden ToString的匿名类。但无论如何,你会得到enumerable作为你的linq查询的输出。你可以应用类似'String.Join(linqResult.Select(x => x.ToString()))' –

+0

现在明白了,从ToString切换到ToList ....有一个很好的输出。它的工作原理。现在正致力于将此列表变为单个字符串或变量...... – Redracer68

回答

1

由于@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(); 

至于你关于“数据是INSIDE标签那样的问题”的问题。这些是XML Attributes的示例。

这里有一个很好的资源,开始学习linq Introduction to LINQ Queries (C#)

1

如何读取数据并保存到变量中没有任何问题。要显示数据,不要试图将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();