【问题标题】:Read next value in XML file读取 XML 文件中的下一个值
【发布时间】:2016-06-20 03:21:55
【问题描述】:

我有一个这样的 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,我想读取下一个 &lt;string&gt;

所以我做的是这样的:

XmlTextReader reader = new XmlTextReader(file);

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

但我没有成功。

感谢您的帮助

【问题讨论】:

    标签: c# xml-parsing readxml


    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我想指出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);
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-02
          • 2018-09-15
          • 1970-01-01
          • 1970-01-01
          • 2018-02-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多