如何使用XmlReader读取xml文档?

时间:2016-10-04 22:02:22

标签: c# xml

我有一个xml:

<doc>
****
<book>
    <author>Pete</author>
    <rating>4</rating>
    <pages>243</pages>
</book>
<shop>
    <></>
    <></>
</shop>
</doc>

我尝试用XmlReader阅读它:

using (XmlReader reader = XmlReader.Create(stream))
{
    reader.MoveToContent();
    //read some elements
    reader.ReadToFollowing("book");

}

但是当我遇到元素book时,我不知道如何进入内部,我的意思是如何阅读authorrating等?以及如何再次移至上一级以阅读shop元素 我试过ReadToDescendant(),但不要认为我需要它 有什么建议吗?

评论中的例子没有帮助我。我忘记了文档中有一个名称空间:

<doc>
  ****
  <book>
      <ns8:author>Pete</ns8:author>
      <ns8:rating>4</ns8:rating>
      <ns8:pages>243</ns8:pages>
  </book>
  <shop>
      <></>
      <></>
  </shop>
</doc>

所以我使用NamespaceManager:

  var nsmgr = new XmlNamespaceManager(reader.NameTable);
  nsmgr.AddNamespace("ns8", "namespace uri1");
  nsmgr.AddNamespace("ns6", "namespace uri2");

阅读文件:

using (XmlReader reader = XmlReader.Create(stream))
{
   while (reader.Read())
   {
       if (reader.NodeType == XmlNodeType.Element)
       {
           reader.ReadToFollowing("book");
           reader.ReadToFollowing("ns8:author");
       }
}

但无论如何,行reader.ReadToFollowing("ns8:author");不会返回author节点。

1 个答案:

答案 0 :(得分:0)

ReadToFollowing方法中指定正确的命名空间。

using (XmlReader reader = XmlReader.Create(stream))
{
    reader.ReadToFollowing("book");

    reader.ReadToFollowing("author", "uri1");
    var author = reader.ReadElementContentAsString();
    Console.WriteLine(author);

    reader.ReadToFollowing("rating", "uri1");
    var rating = reader.ReadElementContentAsInt();
    Console.WriteLine(rating);

    // and so on
}