1

我有一个这样的 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>

<string>如果键是 Id,我想读取下一个值

所以我做的是这样的:

XmlTextReader reader = new XmlTextReader(file);

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

但我没有成功。

感谢帮助

4

3 回答 3

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;
    }
}
于 2016-03-06T16:40:13.883 回答
1

我想指出XmlTextReader 基本上被 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);
}
于 2016-03-06T16:44:37.640 回答
0

您的 XML 看起来与Plist非常相似。所以,听起来你需要一个 Plist 库。无需重新发明轮子,只需使用NuGet 上可用的任何库。他们将解决您解析 XML 文件的问题。

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

于 2016-03-06T16:47:36.030 回答