从xml文件中获取一个字符串

时间:2009-09-05 16:24:48

标签: c# linq-to-xml

我有一个正在尝试获取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文件。

希望你能解决问题。

4 个答案:

答案 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(),您应该获得适合您的查询的节点列表,以及从中获取属性值的节点。