我正在尝试将xml解析为C#中的stringbuilder。但XML文件中包含未确定的标记名称。我不想使用xdoc.elements("tagName")
来放置元素名称。我希望我可以动态循环遍历XML文件。
我拥有的XML是这样的:
<userInfo>
<name> Gummy Bear </name>
<age> 1 </age>
</userInfo>
<userInfo>
<name> Dorito </name>
<Email> IloveDorito@gmail.com </email>
<hobby> eating Doritos </hobby>
</userInfo>
正如您在示例文件中看到的,每个用户唯一的共同标记是<userInfo>
理想的输出将按每个用户分组:
Gummy Bear
,1
,
Dorito
,IloveDorito@gmail.com
,eating Doritos
我有以下代码,但它将一个用户下的所有元素合并为一行。
StringBuilder result = new StringBuilder();
XDocument xdoc = XDocument.Load(@"test.xml");
var userNode = xdoc.Root.Elements("userInfo");
foreach(var d in userNode)
{
result.append(d.value):
}
MessageBox.show (result+"");
答案 0 :(得分:1)
var userInfos = XDocument.Load(filename)
.Descendants("userInfo")
.Select(d => d.Elements().ToDictionary(e => e.Name.LocalName, e => (string)e))
.ToList();
foreach (var ui in userInfos)
{
foreach (var item in ui)
{
Console.WriteLine(item.Key + " > " + item.Value);
}
Console.WriteLine();
}
答案 1 :(得分:0)
在这里你如何得到你需要的东西
static void Main(string[] args)
{
var userInfos = XElement.Load("file.xml").Descendants("userInfo").Select(elt =>
{
var line = elt.Descendants();
return string.Join(",", line.Select(subElt => subElt.Value));
});
foreach (var userInfo in userInfos)
{
Console.WriteLine(userInfo);
}
Console.ReadLine();
}
//我想你有一个像这样的XML文件
<root>
<userInfo>
<name> Gummy Bear </name>
<age> 1 </age>
</userInfo>
<userInfo>
<name> Dorito </name>
<email>IloveDorito@gmail.com </email>
<hobby> eating Doritos </hobby>
</userInfo>
</root>
输出
答案 2 :(得分:0)
代码中最小的变化是基本的嵌套循环:
foreach(var userInfo in xdoc.Root.Elements("userInfo"))
{
var details = userInfo.Elements();
if (details.Count() > 0)
{
foreach(var detail in details)
{
result.Append(detail.Value.Trim() + ", ");
}
result.Remove(result.Length - 2, 2).Append("\n");
}
}
LINQ to XML(即XDocument
及相关类型)确实支持更强大的方法,正如其他答案所示。