【问题标题】:How can I iterate on XML elements from an XML using XMLReader and bypass whitespaces?如何使用 XMLReader 从 XML 中迭代 XML 元素并绕过空格?
【发布时间】:2012-12-17 23:36:00
【问题描述】:

假设你有一个这样的 XML:

    <?xml version="1.0" encoding="utf-8"?>
<Class HashCode="307960707">
  <Person>
    <Class HashCode="-2020100801">
      <FullName>
        <FirstName>Dan</FirstName>
        <LastName>K</LastName>
      </FullName>
    </Class>
    <Age>20</Age>
    <Class HashCode="-439631396">
      <Address>
        <Street>abc</Street>
        <City>new york</City>
        <ZipCode>30500</ZipCode>
        <PhoneNumber>1245</PhoneNumber>
      </Address>
    </Class>
    <Class HashCode="-1436395737">
      <Person>
        <Class HashCode="-1303968324">
          <FullName>
            <FirstName>katty</FirstName>
            <LastName>G</LastName>
          </FullName>
        </Class>
        <Age>18</Age>
        <Class HashCode="-439631396">
          <Address />
        </Class>
        <Class HashCode="307960707">
          <Person />
        </Class>
      </Person>
    </Class>

我希望能够按照它们出现的顺序仅迭代带有XMLReader 的元素,这意味着 class->Person-> class->FullName 等。
我试图使用XMLReader.ReadStartElement() 之类的方法进行导航,但它不起作用,尤其是当我读到"\n" 之类的空格时,它似乎也是一个元素。 :/
我试图用方法XMLReader.Read() 绕过那个空格,但没有成功。

请帮助我了解我应该如何导航。

【问题讨论】:

  • 您的 XML 无效。名称不能包含空格,并且&lt;/&gt; 不是有效的结束标记。
  • 好吧,这只是为了说明,只是,> 不存在,而且元素之间的空格(例如 Dan)也不存在
  • 这不是我的程序的输出,我原来的XML除了我上面提到的之外和这个类似
  • 我的意思是&lt;Zip Code/&gt; 无效。
  • WhitespaceHandling 对您没有帮助吗?见here

标签: c# xml xmlreader


【解决方案1】:

XmlReader 构造函数有一个采用XmlReaderSettings 对象的重载。 XmlReaderSettings 对象有一个 IgnoreWhitespace 属性。

为了只读取下一个元素,您可以在 XmlReader 上实现扩展方法。

这是一个例子:

public static class ExtensionMethods
{
    public static bool ReadNextElement(this XmlReader reader)
    {
        while (reader.Read())
            if (reader.NodeType == XmlNodeType.Element)
                return true;

        return false;
    }
}

这里有一个小控制台应用程序可以演示这一点:

public class Program
{
    public static void Main(string[] args)
    {
        var settings = new XmlReaderSettings();
        settings.IgnoreWhitespace = true;
        settings.IgnoreComments = true;
        settings.IgnoreProcessingInstructions = true;

        var reader = XmlReader.Create("XMLFile1.xml", settings);
        while (reader.ReadNextElement())
            Console.WriteLine(reader.Name);
    }
}

【讨论】:

  • 听起来不错,现在会检查一下,无论如何是否可以使用ReadStartElement()等方法在元素之间进行迭代@
  • 我只是想补充一点,ReadStartElement() 在忽略空白时会在元素之间进行迭代。
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2015-08-18
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多