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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# чтение XML 
V
    Опции темы
Hashashin
Дата 7.10.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток.

Есть файл XML, вида:
Код

 <Territory>
    <ID>10000</ID>
    <Name>Российская Федерация</Name>
    <Parent xsi:nil="true" />
  </Territory>
  <Territory>
    <ID>10001</ID>
    <Name>Центральный федеральный округ</Name>
    <Parent>10000</Parent>
  </Territory>


Нам нужно найти интересующий нас город, округ, к примеру "Центральный федеральный округ" и переписать его ID и Parent.

Делаю так:
Код

XmlTextReader reader = new XmlTextReader(@"c:\territories.xml");
while (reader.Read())
{
   if (reader.Value == "Центральный федеральный округ")
   {
      nameRegion = reader.Value;
    }
}


Здесь мы пишем тот самый регион, а как подняться к атрибуту над именем и под именем?
PM MAIL   Вверх
diadiavova
Дата 7.10.2010, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



При помощи хмлридера - никак, он движется только вперед. Используй либо DOM, либо Linq to XML.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Hohhi
Дата 7.10.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 25.2.2006
Где: Молдова

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



Hashashin, Создай класс Territory с такими полями, как в XML и дисериалезируй в объект класса. 
PM MAIL ICQ   Вверх
jonie
Дата 8.10.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Hashashin, если у вас стоит задача отсортировать XML-ные ноды (как в примере) по зависимостям, то я предлагаю вам использовать топологическую сортировку в xquery или xslt реализованную....

Пример:
Несортированная xml вида:
Код

<?xml version="1.0" encoding="utf-8"?>
<database xmlns:xs="http://www.w3.org/2001/xmlschema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <object id="shipment_document_import_raw" type="table">
    <object id="strsplicing" type="function">
        <ref id="roll_splicings"/>
    </object>
    <object id="get_fabric_date" type="function"/>
    <object id="udf_find_source_roll" type="function">
        <ref id="roll_splicings"/>
        <ref id="rolls"/>
    </object>
.....

(ref-ы означают зависимость)

Задача: отсортировать XML по зависимостям (по порядку).
Рещение:
Код

xquery version "1.0";

declare function local:topological-sorted($nodes) as xs:boolean {
    every $n in $nodes satisfies
          every $id in $n/ref/@id 
                 satisfies $id = $n/preceding::object/@id
};

declare function local:topological-sort($unordered, $ordered )   {
    if (empty($unordered))
    then $ordered
    else
        let $nodes := $unordered [ every $id in ref/@id satisfies $id = $ordered/@id ]
        return 
          if ($nodes)
          then local:topological-sort( $unordered except $nodes, ($ordered, $nodes ))
          else ()  (: cycles so no order possible :)
};


declare function local:finalcheck($nodes) {
    if ( local:topological-sorted($nodes) )
    then $nodes
    else ()     (: error detected :)
};

let $graph := doc("db.xml")/database

let $sortedNodes := (<database>{local:topological-sort($graph/object,())}</database>)


return local:finalcheck($sortedNodes)


есть еще вариант XSLT , но он у меня вроде глючил...
Код

<?xml version="1.0" encoding="UTF-8"?>
<!--
топологическая сортировка (имеет багу?)
-->
<xsl:stylesheet version="2.0" xmlns:bill="http://bill.org" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:function name="bill:computeWeight" as="xs:integer*">
        <xsl:param name="node"/>
        <!-- generate a sequence containing the weights of each node I reference -->
        <xsl:variable name="referencedNodeWeights" as="xs:integer*">
            <xsl:value-of select="0"/>
            <xsl:for-each select="$node/ref/@id">
                <!--<xsl:sequence select="bill:computeWeight(//element[@id=current()])"/> -->
                    <xsl:value-of select="bill:computeWeight(//element[@id=current()])"/>
                <!--</xsl:sequence>-->
            </xsl:for-each>
        </xsl:variable>
        <!-- make my weight higher than any of the nodes I reference -->
        <xsl:value-of select="max($referencedNodeWeights)+1"/>
    </xsl:function>

    <xsl:template match="/">
        <database>
        <xsl:for-each select="database/object">
            <xsl:sort select="bill:computeWeight(.)" data-type="number"/>
            <xsl:copy-of select="."/>
        </xsl:for-each>
        </database>
    </xsl:template>
</xsl:stylesheet>


использовать можно используя бесплатный Altova процессор (MSXML не может такое прожевать). Запускать так
Код

AltovaXML.exe /xquery topologic_sort.xquery /out sortedDB.xml /oi



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Hashashin
Дата 8.10.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, сортировка мне не нужна, мне нужны остальные данные в этой же ветви. Т.е. зная только имя, к примеру "Центральный федеральный округ", узнать его ID и Parent. Я тоже подумывал про десериализацию в класс, но попробую и с DOM и Linq.
Спасибо за ответы!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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