有没有办法在不迭代每个节点和元素的情况下以更简单的方式将xml转换为键值对
我的XML结构与此类似
<root>
<StandardValues>
<ButtonYES alias="customname value">Ja</ButtonYES>
<ButtonNO>Nei</ButtonNO>
</StandardValues>
<Page1>
<Key_Head>2011 Applications</Key_Head>
<Key_Title>Title from 2011</Key_Title>
<Key_Param1>Parameter value</Key_Param1>
</Page1>
<Page2>
<Page_Head>2011 Applications</Page_Head>
<page_Title>Title from 2011</page_Title>
<CustomParam1>Parameter value</CustomParam1>
</Page2>
</root>
很明显,ElementNode名称和子xml节点名称本质上不一致,它可以是任何名称[xml标签[并且它可以是任意数量的子项目
XML转换的想法是为最终对象为Dic的应用程序启用转换
从XML转换为键值对列表
的最佳方法是什么?我试过这个
var maping = doc.Descendants("Page1")
.Elements()
.ToDictionary(d => (string)d.Name.LocalName,
d => (string)d.Value);
但是它只返回一个页面1我们可以为所有孩子的根目录
使用这种方法,我可以将它读取到具有3个属性的类
var maping = doc.Descendants("Page1")
.Elements().Select(d => new
{
Attribute = (string)d.Name.LocalName,
Value = d.Value, // equal to id you are searching for
Key = (d.Attribute("alias") != null) ? d.Attribute("alias").Value : ""
}).ToList();
foreach (var s in maping)
{
string ss = string.Format("{0} - {1} && {2}", s.Key, s.Value, s.Attribute);
}
答案 0 :(得分:2)
不确定你是否已经尝试过这个,
var doc = XDocument.Load(yourXML);
var maping = doc.Root.Elements()
.ToDictionary(a => (string)a.Attribute("key"),
a => (string)a.Attribute("replaceWith"));
还有其他方法,我发现这更快。
答案 1 :(得分:2)
递归LINQ查询将帮助您形成层次结构,
public class AwesomeXml
{
public static void Main()
{
string xml = @"<root>
<StandardValues>
<ButtonYES>Ja</ButtonYES>
<ButtonNO>Nei</ButtonNO>
</StandardValues>
<Page1>
<Key_Head>2011 Applications</Key_Head>
<Key_Title>Title from 2011</Key_Title>
<Key_Param1>Parameter value</Key_Param1>
</Page1>
<Page2>
<Page_Head>2011 Applications</Page_Head>
<page_Title>Title from 2011</page_Title>
<CustomParam1>Parameter value</CustomParam1>
</Page2>
</root>";
var doc = XDocument.Parse(xml);
var result = ConvertXmlToDic(doc.Root);
Console.Read();
}
private static object ConvertXmlToDic(XElement element)
{
var result = element.Elements().
Select(
e => new { Key = e.Name,
Value = (e.Descendants().Count() == 0) ? e.Value : ConvertXmlToDic(e)
}
).ToDictionary(e => e.Key, e => e.Value);
return result;
}
}