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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> xPath, c#, разница компилированных и обычных выраже 
V
    Опции темы
eskaflone
  Дата 30.9.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



общий
Код

            XmlDocument     xmlDoc = new XmlDocument();
            XmlNodeList     xmlNod;

............................
                load1 = new DateTime(DateTime.Now.Ticks);
                xmlDoc.Load("out" + i.ToString() + ".xml");
                load2 = new DateTime(DateTime.Now.Ticks);
                loadC2 += load2 - load1;



первый вариант, не компилированные выражения
Код

                proc1 = new DateTime(DateTime.Now.Ticks);
                xmlNod = xmlDoc.SelectNodes("/документ/таблица/строка[@uid=" + uid.ToString() + "0]/attribute::u"
                                             + colNum.ToString());
                foreach (XmlNode node in xmlNod)
                {
                    sum += ulong.Parse(node.Value);
                }
                proc2 = new DateTime(DateTime.Now.Ticks);
                procC2 += proc2 - proc1;



компилированные выражения
Код

            XPathNavigator  xNav = xmlDoc.CreateNavigator();
            XPathExpression xExpr = xNav.Compile("/документ/таблица/строка[@uid=" + uid.ToString()
                                                  + "0]/attribute::u" + colNum.ToString());
            XPathNodeIterator xIter;

                proc3 = new DateTime(DateTime.Now.Ticks);
                xIter = xNav.Select(xExpr);
                while (xIter.MoveNext())
                {
                    sum2 += ulong.Parse(xIter.Current.Value);
                }
                proc4 = new DateTime(DateTime.Now.Ticks);
                procC3 += proc4 - proc3;



Код

<?xml version="1.0" encoding="windows-1251" ?> 
- <документ uid="1">
- <таблица uid="0">
  <строка uid="00" u0="592959" u1="366333" u2="324482" u3="15097" /> 
  <строка uid="10" u0="435784" u1="25293" u2="161748" u3="321399" /> 
  <строка uid="20" u0="656997" u1="600608" u2="326614" u3="450112" /> 
...........................................
  </таблица>
- <таблица uid="1">
  <строка uid="00" u0="562597" u1="768604" u2="318302" u3="677374" /> 
  <строка uid="10" u0="872530" u1="912809" u2="555405" u3="51051" /> 
...........................................
  </таблица>
  </документ>

второй вариент работает чуть медленнее первого около 5-7%

Вопрос: может я не совсем оптимально эти варианты написал?




и попутно второй вопрос:

Код

xmlNod = xmlDoc.SelectNodes("/документ/таблица/строка[@uid=" + uid.ToString() + "0]/attribute::u"
                                             + colNum.ToString());

этот запрос возвращает список элементов вида:
u2="467853"
u2="56783"
и так далее ровно столько сколько есть в файле таблиц.

С помощью XPathNavigator можно выполнять запросы типа sum(...) которые выдают не ноды, а числа. Так вот как этим воспользоваться чтобы суммировать не так как я, а что бы сумма уже возвращалась мне.
PM MAIL   Вверх
eskaflone
  Дата 1.10.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



всё, вроде разобрался с обоими вопросами, 5-7% это просто погрешность оказалась, и с суммированием тоже всё просто)
PM MAIL   Вверх
eskaflone
  Дата 2.10.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



возник другой вопрос:

пусть имеется следующий файл:
Код

 <?xml version="1.0" encoding="windows-1251" ?> 
- <форма uid="RPT02" name="основная форма отправления электронной отчетности непонятно по какому предмету отчетности">
- <учреждение uid="1" name="контора номер 1">
+ <таблица uid="1">
  <строка uid="010" u1="17" u2="2795929" u3="618767" u4=".../> 
  <строка uid="020" u1="17" u2="3241285" u3="6444042" u4=".../> 
.............
/> 
  </таблица>
- <субтаблица uid="6">
  <строка uid="010" u1="2631732" u2="117000000554317" u3="3165361" .... /> 
  <строка uid="020" u1="5858274" u2="217000000554317" u3="482759" .../> 



задача:
1) если в первой таблице(uid=1) в первой строке(Uid=1) второй атрибут(u1) равен 17
Код

number(/форма/учреждение/таблица[@uid=1]/строка[@uid=010]/attribute::u1)

(получает число 17)

2) в субтаблице(uid=6) строке (uid=010) атрибут(u2) начинается на "117"
Код

/форма/учреждение/субтаблица[@uid=6]/строка[@uid=010 and start-with(@u2, "117")]

(возвращает строку в которой совпадение(то есть первую))

как составить запрос что бы при выполнении этих двух условий мне на вывод приходила например стока(uid=020) субтаблицы (uid=6)?
PM MAIL   Вверх
eskaflone
Дата 2.10.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



всё, разобрался
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


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

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


 




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


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

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