Использование XmlReader.ReadToDescendant () - PullRequest
1 голос
/ 10 января 2012

Я пытаюсь прочитать 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). Я получаю reader.Name просто отлично, но читатель ["ogr: X"] всегда возвращается в ноль. Похоже, я не использую ReadToDescendant и Reader должным образом, но я не совсем уверен, с чего начать.

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Строки gml и ogr представляют пространства имен. Элемент, который вы ищете, это featureMember. Так что вам нужно позвонить

reader.ReadToDescendant("featureMember");
1 голос
/ 10 января 2012

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
...