我有一个正在尝试获取url存在的xml文件ID的coode。
我的代码
public static string GetPageIdByUrl(string url)
{
string folder = HttpContext.Current.Server.MapPath("/App_Data/Pages/" + Path.DirectorySeparatorChar);
foreach (string file in Directory.GetFiles(folder, "*.xml", SearchOption.TopDirectoryOnly))
{
var xml = XDocument.Load(file);
var q = from f in xml.Descendants("Page")
where (string)f.Element("Url").Value == url
select (string)f.Attribute("Id").Value;
if (q.Count() != 0)
{
return q.SingleOrDefault();
}
}
return null;
}
我收到此错误:
对象引用未设置为对象的实例。 行:选择f.Attribute(“Id”)。值;
如果xml文件中存在“test”<Url>test</Url>
,我希望它返回属性ID。但是这个sems只适用于第一个xml文件。
希望你能解决问题。
答案 0 :(得分:3)
尝试发布一些示例XML。
我猜你的Url元素没有“Id”(精确拼写)属性。因此,XNode为null,无法提供值。
答案 1 :(得分:1)
Id
元素上有Url
个属性吗?
<Pages>
<Page><Url Id="6428">http://www.example.com/</Url></Page>
</Pages>
然后你需要这样的东西:
var q = from f in xml.Descendants("Page")
where (string)f.Element("Url") == url
select (string)f.Element("Url").Attribute("Id");
(注意,当使用强制转换作为XElement和XAttribute定义强制转换为各种基类型时,你可以省略.Value
。这通常是意外的NullReferenceExceptions的来源。)
答案 2 :(得分:0)
我今天转过头来,问题是在xml文件中属性是calld“id”而不是“Id”。
答案 3 :(得分:0)
您是否考虑过使用XPath?
自从我使用语法以来已经有一段时间了,但查询看起来应该与此类似:
/页[URL = 'THE_STRING']
使用SelectNodes(),您应该获得适合您的查询的节点列表,以及从中获取属性值的节点。