第一次使用LINQ to XML,攀登学习曲线......
我正在寻找如何从XML文件中检索和转换数据的最流畅的方法,尽可能少的if-else和上帝禁止的try-catch语句。我真的很讨厌所有冗长的代码,只是为了从doc中检索单个值。
话虽如此,我正在寻找一种自动防故障解决方案,如果XML文档的结构出乎意料地发生了变化,那么这种解决方案就不会中断。在这种情况下,我希望检索到null值,以便稍后在代码中检查它。
这是我的XML文档:
<?xml version="1.0" encoding="utf-8"?>
<Entry>
<IntField>11</IntField>
<StringField>String data</StringField>
<DateTimeField>28/03/2013 18:10:02</DateTimeField>
</Entry>
我正在寻找代码,我在每行代码中检索一个值,即:
myXMLdoc = XDocument.Load("sourceFile.xml");
int? myIntField = (smart linq query that retrieves&converts the value, with fallback of null);
string? myStringField = (smart linq query etc.);
DateTime? myDateTimeField = (smart linq query etc.);
if (myIntField == null)
{
// Complain that structure of the XML doc is bad
}
也许我对LINQ可以做到这一点的期望是天真的,但是,好吧,我已经写了一些XPAT表达式和if-else语句的块和简单的非常好的XML处理,我已经对它产生了一些苦涩。所以我真的转向LINQ。
答案 0 :(得分:2)
虽然LINQ2XML本身缺乏必要的“魔力”,但它为你自己构建代码提供了足够的“基础”。这是一个示例,向您展示如何从任意深度的元素读取int?
(当然,假设路径是唯一的):
public static class LinqExt {
public static int? ReadInt(this XElement e, string path, int? fallback = null) {
foreach (var name in path.Split('/')) {
e = e.Element(name);
if (e == null) {
return fallback;
}
}
int val;
return int.TryParse(e.Value, out val) ? val : fallback;
}
}
您可以按如下方式使用此扩展方法:
var myXMLdoc = XDocument.Load("sourceFile.xml");
var intVal = myXMLdoc.Root.ReadInt("IntField");
即使使用某些嵌套,该方法也可以工作,例如,如果您的文档看起来像这样
<?xml version="1.0" encoding="utf-8"?>
<Entry>
<Nested1>
<Nested2>
<IntField>11</IntField>
</Nested2>
</Nested1>
</Entry>
你会得到这样的价值:
var intVal = myXMLdoc.Root.ReadInt("Nested1/Nested2/IntField");