C#:获取XML中子元素值的集合?

时间:2018-09-30 23:48:44

标签: c# .net xml

我对XML和C#本身还很陌生,所以如果这看起来很傻,我感到很抱歉。我正在尝试获取子xml元素值的值列表。让我进一步解释。

我有这样的xml代码,出于可读性考虑,我只发表了一篇文章,但它们都是一样的。

<posts>
    <post id="1949239" reblogged-from-name="iwanttofly">
    </post>
</posts>

这是代码

var rebloggers = (from n in document.Descendants("post") select n.Element("reblogged-from-name")).ToList().Select(x => x.Value);

我被这个例外欢迎

System.NullReferenceException: Object reference not set to an instance of an object.
   at Jimese.Common.Utilities.TumblrUtilities.<>c.<FetchMediaForPage>b__0_1(XElement x) in C:\Users\admin\Desktop\Jimese\Utilities.cs:line 20

第20行是上面的代码,var rebloggers...

2 个答案:

答案 0 :(得分:2)

reblogged-from-name不是元素,而是属性。您应该改用n.Attribute("reblogged-from-name")

document.Descendants("post")
        .Select(n => n.Attribute("reblogged-from-name").Value)
        .ToList()

答案 1 :(得分:0)

我会将它作为xml进行C#反序列化。

创建您的类,例如:

 [XmlRoot(ElementName="post")]
    public class Post {
        [XmlAttribute(AttributeName="id")]
        public string Id { get; set; }
        [XmlAttribute(AttributeName="reblogged-from-name")]
        public string Rebloggedfromname { get; set; }
    }

    [XmlRoot(ElementName="posts")]
    public class Posts {
        [XmlElement(ElementName="post")]
        public Post Post { get; set; }
    }

然后使用xml反序列化

 XmlSerializer serializer = new XmlSerializer(typeof(Posts));
    using (TextReader reader = new StringReader(testData)) // test data is your xml
    {
        var result = (Posts) serializer.Deserialize(reader);
    }