使用XMLTextReader,我如何知道我在哪个元素上?

4
这是我的代码样式:

这是我的代码样式:

case "Creator":
    br.Read();
    br.MoveToContent();  // gives the content of the role
    tbComposer.Text = br.Value;
    br.Read();
    br.MoveToContent();  // gives the content of the role
    tbConductor.Text = br.Value;
    br.Read();
    br.MoveToContent();  // gives the content of the role
    tbOrchestra.Text = br.Value;
    break;

这是可行的代码:(感谢大家的建议...没有你们就无法完成!) Spokane-Dude
                case "Creator":
                    br.MoveToFirstAttribute();
                    if (br.Value == "Composer") {
                        br.Read();
                        tbComposer.Text = br.Value;
                    }
                    if (br.Value == "Conductor") {
                        br.Read();
                        tbConductor.Text = br.Value;
                    }
                    if (br.Value == "Orchestra") {
                        br.Read();
                        tbOrchestra.Text = br.Value;
                    }
                    break;

这是我的XML的样子:

<ItemLookupResponse>
    <OperationRequest/>
    <Items>
        <Request/>
        <Item>
            <ItemAttributes>
                <Binding>Audio CD</Binding>
                <CatalogNumberList>
                    <CatalogNumberListElement>43850</CatalogNumberListElement>
                </CatalogNumberList>
                <Creator Role="Composer">Gioachino Rossini</Creator>
                <Creator Role="Conductor">Riccardo Chailly</Creator>
                <Creator Role="Orchestra">National Philharmonic Orchestra</Creator>
            </ItemAttributes>
        </Item>
    </Items>
</ItemLookupResponse>

我需要知道我是否正在读取元素 Creator Role="Composer"Creator Role="Conductor" 等等。

因此,使用 XMLTextReader,我如何确定元素文本是什么?


您发布的XML无效。请发布实际的XML,或者至少提供一个能够重现问题的小例子。 - John Saunders
你使用的是哪个版本的.NET? - John Saunders
你是什么意思?在你的问题中发布它,选择它,然后按Control-K将其缩进四个字符,以便它被视为代码。 - John Saunders
嘿,约翰...抱歉...我需要将它移动到编辑器中...你想让我这样做吗?还是你能看出发生了什么? - SpokaneDude
今晚得走了...明早早点回来...感谢迄今为止的帮助... - SpokaneDude
显示剩余4条评论
2个回答

1

在读取之前,您无法知道XmlTextReader读取的内容。XmlTextReader按顺序读取流。

因此,情况正好相反:当您到达属性Role="Composer"时,您才能知道所需元素。

考虑使用XPath、LINQ-To-XML或类似工具:http://msdn.microsoft.com/en-us/library/bb156083.aspx

node.XPathSelectElement(@"*/Creator[@Role=""Conductor""]");

对于XmlTextReader,有一个XPathReader组件可以使用:


这是我的代码:' case "Creator": br.Read(); br.MoveToContent(); // 给出角色的内容 tbComposer.Text = br.Value; br.Read(); br.MoveToContent(); // 给出角色的内容 tbConductor.Text = br.Value; br.Read(); br.MoveToContent(); // 给出角色的内容' - SpokaneDude
你能否更新一下问题呢?读了那个评论让我感到头疼 :) - sehe
把这个放在你的问题里,而不是评论中。 - John Saunders

1

这个示例怎么样?希望对你有用。

   static void Main(string[] args)
    {

        string xmlStr = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Creators><Creator Role=\"Composer\">Gioachino Rossini</Creator><Creator Role=\"Conductor\">Riccardo Chailly</Creator><Creator Role=\"Orchestra\">National Philharmonic Orchestra</Creator></Creators>";
        using (XmlReader xmlReader = XmlTextReader.Create(new StringReader(xmlStr)))
        {
            xmlReader.MoveToContent();
            xmlReader.ReadStartElement("Creators" , "");
            SomeMethod("Composer", xmlReader);
            SomeMethod("Conductor", xmlReader);
            SomeMethod("Orchestra", xmlReader);
        }

        Console.WriteLine("........");
        Console.Read();
    }

    static void SomeMethod(string role, XmlReader xmlReader)
    {
        xmlReader.MoveToAttribute("Role");

        switch (role)
        {
            case "Composer":
                {
                    xmlReader.MoveToContent();
                    Console.WriteLine(string.Format("Composer:{0}", xmlReader.ReadElementContentAsString()));

                } break;
            case "Conductor":
                {
                    xmlReader.MoveToContent();
                    Console.WriteLine(string.Format("Conductor:{0}", xmlReader.ReadElementContentAsString()));

                } break;
            case "Orchestra":
                {
                    xmlReader.MoveToContent();
                    Console.WriteLine(string.Format("Orchestra:{0}", xmlReader.ReadElementContentAsString()));

                } break;

            default: break;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接