读取XML文件中的下一个值

时间:2016-03-06 16:04:40

标签: c# xml-parsing readxml

我有一个类似的XML文件:

    <key>businessAddress</key>
    <string>Moka</string>
    <key>businessName</key>
    <string>Moka address</string>
    <key>Id</key>
    <string>39</string>
    <key>Cat</key>
    <string>216</string>
    <key>deals</key>

如果密钥为Id

,我想读取下一个<string>

所以我做的是:

XmlTextReader reader = new XmlTextReader(file);

while (reader.Read())
{
    if (reader.Value.Equals("Id"))
    {
        reader.MoveToNextAttribute
    }  
}

但我没有成功。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

您可以使用布尔标志来指示是否应该读取下一个元素的值:

bool shouldReadId = false;
while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Text && shouldReadId)
    {
        Console.WriteLine(reader.Value); // will print 39
        shouldReadId = false;
    }

    if (reader.Value.Equals("Id"))
    {
        // indicate that we should read the value of the next element
        // in the next iteration
        shouldReadId = true;
    }
}

答案 1 :(得分:1)

我想指出XmlTextReader is basically replaced with XmlReader

  

从.NET Framework 2.0开始,我们建议您使用   而是System.Xml.XmlReader类。

虽然他们的对象模型没有任何显着的不同。

因此,如果您想使用XmlTextReader,您可以执行以下操作:

public static class XmlReaderExtensions
{
    public static void EnsureRead(this XmlTextReader reader)
    {
        var isRead = reader.Read();
        if (!isRead)
            throw new InvalidOperationException("Failed to read");
    }

    public static void SkipUntil(this XmlTextReader reader, Func<XmlTextReader, Boolean> isStop)
    {
        while (!isStop(reader))
        {
            reader.EnsureRead();
        }
    }
}

...

var xml = @"<root>   <key>businessAddress</key>
    <string>Moka</string>
    <key>businessName</key>
    <string>Moka address</string>
    <key>Id</key>
    <string>39</string>
    <key>Cat</key>
    <string>216</string>
    <key>deals</key> </root>";

using (var stream = new MemoryStream(Encoding.Default.GetBytes(xml)))
using (var reader = new XmlTextReader(stream))
{
    reader.SkipUntil(cur => cur.Value == "Id");
    reader.EnsureRead(); // Skip current node
    reader.SkipUntil(cur => cur.NodeType == XmlNodeType.Text);
    Console.WriteLine("The id from XmlTextReader is {0}", reader.Value);
}

虽然为了确保正常工作使用某些xml快速失败,但这与给定的模式不对应,您将不得不添加更多的健全性检查,所以...

如果您不关心整个xml树被放入内存,您也可以尝试LINQ-TO-XML

using (var stream = new MemoryStream(Encoding.Default.GetBytes(xml)))
{
    var xdoc = XDocument.Load(stream);
    var id = xdoc
        .Root
        .Elements("key")
        .First(element =>
            element.Value == "Id")
        .ElementsAfterSelf("string")
        .First()
        .Value;
    Console.WriteLine("The id from XDocument is {0}", id);
}

答案 2 :(得分:0)

您的XML看起来与Plist非常相似。所以,听起来你需要一个Plist库。不要重新发明轮子,只需使用any of the libraries available on NuGet。他们将解析您解决XML文件的问题。

如果您坚持手动解析XML,请忘记低级SAX类并只使用DOM。使用XDocument要容易得多。请参阅 @EugenePodskal 的解决方案。