Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не совсем обычный XML?? Затруднение первого рода - неожиданная и 
:(
    Опции темы
Flass
  Дата 27.5.2012, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.5.2012

Репутация: нет
Всего: нет



Решил таки создать новую тему. Пишу на C# и столкнулся с проблемой.
Есть документ XML. который представляет из себя вот что:
Код

<?xml version="1.0" encoding="iso-8859-1"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>
  <!-- Begin Style Definitions -->
  <Style id="area1">
    <LineStyle>
      <color>FF000000</color>
      <width>1</width>
    </LineStyle>
    <PolyStyle>
      <color>BF000000</color>
      <fill>0</fill>
      <outline>1</outline>
    </PolyStyle>
  </Style>
  <Folder>
    <name>Area Features</name>
    <description>Area Features</description>
    <Placemark>
      <description>Unknown Area Type</description>
      <styleUrl>#area1</styleUrl>
      <Polygon>
        <outerBoundaryIs>
          <LinearRing>
            <coordinates>
              85.0620149611,56.4730628152,0
              85.0620098926,56.4729651555,0
              85.0622567155,56.4729612316,0
              85.0622617838,56.4730588913,0
              85.0620149611,56.4730628152,0
            </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>
и далее в том же духе, до n полигонов.


есть код, который должен вставлять в каждый полигон после тегов  <coordinates> </coordinates> строку <altitude>relativeToGround</altitude>
Повторюсь, нужно - в каждый полигон!
Привожу код.

Код

void ParseKML(string _Path)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(_Path);
            XmlNamespaceManager nmr = new XmlNamespaceManager(doc.NameTable);
            nmr.AddNamespace("opengis", @"http://www.opengis.net/kml/2.2");
            nmr.AddNamespace("google", @"http://www.google.com/kml/ext/2.2");
            XmlNodeList nodes = doc.SelectNodes(@"//opengis:Polygon", nmr);
            for (int i = 0; i < nodes.Count; i++)
            {
                var first = nodes[i];
                ProcessPolygon(doc, first as XmlNode, nmr);
                MessageBox.Show(first.InnerXml);
            }
           
                doc.Save(SaveFileDialog1.FileName);
            }
 
        }
        static void ProcessPolygon(XmlDocument doc, XmlNode polygon, XmlNamespaceManager xnm)
        {
            if (polygon == null) return;
            var relativeToGroundElement = doc.CreateElement("altitude", @"http://www.opengis.net/kml/2.2");
            var linearRingElement = polygon.SelectSingleNode(@"//opengis:LinearRing", xnm);
            relativeToGroundElement.InnerText = "relativeToGround";
            linearRingElement.AppendChild(relativeToGroundElement);
            
        }

почему то, данный код вставляет элемент <altitude>relativeToGround</altitude> только в первый узел Polygon.
Т.е. выходной файл выглядит так:

Код

styleUrl>#area1</styleUrl>
       <Polygon>
         <outerBoundaryIs>
           <LinearRing>
             <coordinates>
             85.0620149611,56.4730628152,0
             85.0620098926,56.4729651555,0
             85.0622567155,56.4729612316,0
             85.0622617838,56.4730588913,0
             85.0620149611,56.4730628152,0
           </coordinates>
             <altitude>relativeToGround</altitude>
             <altitude>relativeToGround</altitude>
             <altitude>relativeToGround</altitude>
             .....................................
             n = PolygonList.Count


а мне нужно добавлять этот элемент в каждый узел Polygon. Как победить эту проблему? Абсолютно нет догадок почему так происходит.
Здесь

Код

var relativeToGroundElement = doc.CreateElement("altitude", @"http://www.opengis.net/kml/2.2");
            var linearRingElement = polygon.SelectSingleNode(@"//opengis:LinearRing", xnm);
            relativeToGroundElement.InnerText = "relativeToGround";
            linearRingElement.AppendChild(relativeToGroundElement);


полигон берётся новый, но appendchild происходит только в первый! Как же так?
Разве код var linearRingElement = polygon.SelectSingleNode(@"//opengis:LinearRing", xnm); не должен выбирать в каждом новом полученном полигоне свою точку вставки? 
PM MAIL   Вверх
Flass
Дата 27.5.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.5.2012

Репутация: нет
Всего: нет



Разобрался, с помощью maxim84_ с исходников.ру

В общем, нужно было писать не
Код

 var linearRingElement = polygon.SelectSingleNode(@"//opengis:LinearRing", xnm);

а вот так
 
Код

var linearRingElement = polygon.SelectSingleNode(@"descendant::opengis:LinearRing", xnm);

и всё заработало так как надо.

Тема закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.