Using XmlReader.ReadToDescendant()

本文关键字:ReadToDescendant XmlReader Using | 更新日期: 2023-09-27 18:19:48

我试图通读一个XML(实际上是一个GML,但我认为这没有什么区别),但在解析方面遇到了问题。这是我第一次接触XML。

我在C#中的代码

void ParseXML(String path)
{
    XmlReader reader = XmlReader.Create( new FileStream( path, FileMode.Open ) );
    reader.Read();
    while( reader.Read() )
    {
        // Only detect start elements.
        if ( reader.IsStartElement() && reader.Name == "gml:featureMember" )
        {
            Debug.Log(reader.Name);
            reader.ReadToDescendant("gml:featureMember");
            Debug.Log(reader["ogr:X"]);
        }
    }
}

我正在使用的GML的一个部分:

  <gml:featureMember>
    <ogr:fence_neighbors fid="F1">
      <ogr:Name>Xyz Xyz</ogr:Name>
      <ogr:X>2353.45361911000</ogr:X>
      <ogr:Y>-4652.36641288000</ogr:Y>
    </ogr:fence_neighbors>
  </gml:featureMember>

更困难的是,我在没有访问System.Xml.Linq(Unity3D)的情况下工作。我有读者。名称很好,但读卡器["ogr:X"]总是显示为null。我似乎没有正确使用ReadToDescendant和Reader,但我不太确定从哪里开始。

Using XmlReader.ReadToDescendant()

XmlReader在使用名称空间前缀时并不知道这些前缀。

这是一个测试程序,它可以做我认为你想要的事情。请注意,命名空间URI是显式给定的。

using System;
using System.IO;
using System.Xml;

class SOTest {
    static void Main(string[] args) {
        ParseXML(args[0]);
    }
    static void ParseXML(String path)
    {
        XmlReader reader = XmlReader.Create( new FileStream( path, FileMode.Open ) );
        reader.Read();
        while( reader.Read() )
        {
            // Only detect start elements.
            if ( reader.IsStartElement() && reader.LocalName == "featureMember" && reader.NamespaceURI == "gml-namespace-uri" )
            {
                Console.WriteLine(reader.Name);
                reader.ReadToDescendant("X", "ogr-namespace-uri");
                Console.WriteLine(reader.ReadInnerXml());
            }
        }
    }
}

我在源文档中添加了声明以进行测试:

<?xml version="1.0" encoding="utf-8"?>
<wrapper xmlns:gml="gml-namespace-uri" xmlns:ogr="ogr-namespace-uri">
  <gml:featureMember>
    <ogr:fence_neighbors fid="F1">
      <ogr:Name>Xyz Xyz</ogr:Name>
      <ogr:X>2353.45361911000</ogr:X>
      <ogr:Y>-4652.36641288000</ogr:Y>
    </ogr:fence_neighbors>
  </gml:featureMember>
</wrapper>

输出只是

gml:featureMember
2353.45361911000

gmlogr字符串表示名称空间。您要查找的元素是featureMember。所以你需要打电话给

reader.ReadToDescendant("featureMember");
相关文章:
  • 没有找到相关文章