C#ASP.NET:“对象引用未设置为对象的实例。” System.Xml.Linq.XElement.Attribute(...)返回null

时间:2020-07-08 01:54:36

标签: c# asp.net

创建用于获取,更新,删除电影的应用程序

我试图从XML文件中获取电影列表,但是每次我使用WebService测试器并尝试获取因该错误而被击中的电影列表时

“对象引用未设置为对象的实例。” System.Xml.Linq.XElement.Attribute(...)返回null

我的代码

public class Movie
{
    private static string _xmlDataPath = HttpContext.Current.Server.MapPath("~/App_Data/Movies.xml");

    public int Id { get; set; }
    public string Title { get; set; }
    public string Director { get; set; }
    public string Synopsis { get; set; }

    public Movie(int id, string title, string director, string sypnosis)
    {
        this.Id = id;
        this.Title = title;
        this.Director = director;
        this.Synopsis = sypnosis;
    }

    public XElement toXML(XNamespace ns)
    {
        return new XElement(ns + "Movie",
            new XElement(ns + "Id", this.Id),
            new XElement(ns + "Title", this.Title),
            new XElement(ns + "Director", this.Director),
            new XElement(ns + "Sypnosis", this.Synopsis)
            );

    }

    public static List<Movie> GetAllMovies()
    {
        List<Movie> movieList = new List<Movie>();

        //Load XML file using LINQ
        XDocument doc = XDocument.Load(_xmlDataPath);
        var xmlMoviesList = doc.Root.Elements();
        XNamespace ns = doc.Root.GetDefaultNamespace();
        //Get each movie element from XML
        foreach (var xmlMovies in xmlMoviesList)
        {
            Movie movie = new Movie(
                int.Parse(xmlMovies.Attribute("Id").Value),
                xmlMovies.Element(ns + "Title").Value,
                xmlMovies.Element(ns + "Director").Value,
                xmlMovies.Element(ns + "Sypnosis").Value
                );
            //Add to the list
            movieList.Add(movie);
        }

        //Return the list
        return movieList;
    }

1 个答案:

答案 0 :(得分:0)

如果您可以包含示例XML,那就太好了,否则人们必须猜测一下。

您的代码可以很好地解析XML文件,并将Id作为属性。

<Root>
  <Movie Id="1">
    <Title>Alien</Title>
    <Director>Ridley Scott</Director>
    <Sypnosis>In space no one can hear you scream.</Sypnosis>
  </Movie>
</Root>

但是,您编写的toXML函数会生成以Id作为节点的XML

<Root>
  <Movie>
    <Id>1</Id>
    <Title>Alien</Title>
    <Director>Ridley Scott</Director>
    <Sypnosis>In space no one can hear you scream.</Sypnosis>
  </Movie>
</Root>

确定是否要将Id作为属性或节点,并相应地调整代码。将new XElement(ns + "Id", this.Id),更改为new XAttribute(ns + "Id", this.Id),或将xmlMovies.Attribute("Id").Value更改为xmlMovies.Element(ns + "Id").Value

在旁注中,请查看int.TryParse的文档,并尝试使用它代替int.Parse。最好确保您首先在要解析的数据中包含一个整数

相关问题