循环遍历xml Elements问题

时间:2012-03-07 16:55:23

标签: c# asp.net xml

我有一个很大的XMLTEXTREADER读取。

这是我的代码

while (reads.Read())
{
    switch (reads.NodeType)
    {
        case XmlNodeType.Element:
        {

            if (reads.Name == "TITLE")
            {
                Response.Write("<Br />");
                Intel = reads.ReadInnerXml();
            }
            Response.Write(Intel);
            Intel = "";

         }
         break;
     }
 }

这适用于打印文档中的所有标记。现在我有一个名为Authors的标签,对于一些书籍,我有一个以上的作者。

所以我的XML看起来如下

<set1>
<title>Test </Title>
<intel_auth id="9">
<fname>ABC</fname>
 <mname>M.</mname>
<lname>app</lname>
  </intel_auth>
  <intel_auth id="130">
 <fname>Brad</fname>
 <lname>e</lname>
 </intel_auth_auth>
 <intel_auth id="31">
 <fname>Robin</fname>
 <lname>neil</lname>
 </intel_auth>
 <intel_auth id="232">
 <fname>Mason</fname>
 <lname>Rodriguez</lname>
</intel_auth>
</set1>

我有多个套装,它打印所有标题,而不是打印旁边的作者姓名。

我使用下面的代码

case XmlNodeType.Element:
                            {
                                //string strURI = reads.NamespaceURI;
                                //string name = reads.Name;
                                string Authors = "";

                                if (reads.Name == "TITLE")
                                {
                                    Response.Write("<Br />");

                                   Intel = reads.ReadInnerXml();

                                   if (reads.Name == "FNAME")
                                   {
                                       Authors += reads.Value;


                                   }
                                   if (reads.Name == "MNAME")
                                   {
                                       Authors += reads.Value;


                                   }
                                   if (reads.Name == "LNAME")
                                   {
                                       Authors += reads.Value;


                                   }

                                }

                                Response.Write(Intel+Authors);
                                Intel = "";
                                Authors = "";
                            }
                            break;

2 个答案:

答案 0 :(得分:0)

当调用ReadInnerXml时,它会将阅读器推进到关闭标记之后的下一个节点,因此您的代码永远不会看到作者名称节点。该方法的文档提供了详细信息。

尝试ReadStartElement将其放在intel_auth元素上。

答案 1 :(得分:0)

Xml区分大小写。更改所有比较以匹配xml的大小写。你的xml中的标题是titleTitle,是吗?

如果你不介意,我可以帮你使用Linq:

我创建了一个名为Author的类(我正在使用这些扩展名:http://searisen.com/xmllib/extensions.wiki

public class Author
{
    XElement self;
    public Author(XElement self) { this.self = self; }

    public int Id { get { return self.Get("id", 0); } }
    public string LastName { get { return self.Get("lname", string.Empty); } }
    public string FirstName { get { return self.Get("fname", string.Empty); } }
    public string MiddleName { get { return self.Get("mname", string.Empty); } }

    public override string ToString()
    {
        return FirstName + MiddleName + LastName;
    }
}

然后是一本书课:

public class Book
{
    XElement self;
    public Book(XElement self) { this.self = self; }

    public Author[] Authors
    {
        get { return _Authors ?? // if _Authors is null, create it and then return it
            (_Authors = self.GetEnumerable("intel_auth", xauthor => new Author(xauthor)).ToArray()); }
    }
    Author[] _Authors;

    public string Title
    {
        get { return self.Get("title", string.Empty); }
    }
}

我不确定如何从xml片段加载图书,但如果每本书都是set1set1是文件根节点的节点...

Book[] books = XElement.Load("file.xml")
                   .GetEnumerable("set1", xbook => new Book(xbook))
                   .ToArray();

然后你可以遍历所有书籍,以及书中的所有作者:

foreach(Book book in books)
{
    Response.Write(book.Title); 
    foreach(Author author in book.Authors)
    {
        Response.Write("<Br />" + author.ToString());
    }
}