Библиотеки: EasyXML - XML Parser

 

EasyXML - XML Parser:

EasyXML - это MQL5-библиотека для парсинга XML-документов.

Она может обрабатывать XML-документы из трех разных источников: URL, файл и cтрока. Библиотека является полностью объектно-ориентированной и аккуратно интегрируется с MQL5 за счет использования классов CObject и CArrayObj Стандартной библиотеки для хранения DOM-дерева.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- создаем объект класса CEasyXml
   CEasyXml EasyXmlDocument;

//--- выключаем опцию отладки
   EasyXmlDocument.setDebugging(false);

//--- пример: прохождение по элементам DOM-дерева
   if(EasyXmlDocument.loadXmlFromUrl("http://www.forexfactory.com/ffcal_week_this.xml"))
     {
      CEasyXmlNode *RootNode=EasyXmlDocument.getDocumentRoot();

      //--- цикл прохода по дочерним узлам корневого узла
      for(int i=0; i<RootNode.Children().Total(); i++)
        {
         CEasyXmlNode *ChildNode=RootNode.Children().At(i);
         Print(IntegerToString(i)+" "+ChildNode.getName());

         //--- цикл прохода по дочерним узлам
         for(int j=0; j<ChildNode.Children().Total(); j++)
           {
            CEasyXmlNode *SubNode=ChildNode.Children().At(j);
            Print(IntegerToString(i)+"-"+IntegerToString(j)+"   "+SubNode.getName()+" | "+SubNode.getValue());
           }
        }
     }
  }
Результат работы скрипта:
GP      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      0 event
PK      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      0-0   title | Bank Holiday
DL      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      0-1   country | JPY
ND      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      0-2   date | 12-23-2013
KI      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      0-3   time | 12:00am
HO      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      0-4   impact | Holiday
HI      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      0-5   forecast | 
ON      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      0-6   previous | 
JF      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      1 event
IL      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      1-0   title | UBS Consumption Indicator
IP      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      1-1   country | CHF
EH      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      1-2   date | 12-23-2013
HN      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      1-3   time | 7:00am
GK      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      1-4   impact | Low
ML      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      1-5   forecast | 
ID      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      1-6   previous | 1.28
EK      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      2 event
HN      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      2-0   title | German Import Prices m/m
QE      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      2-1   country | EUR
PO      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      2-2   date | 12-23-2013
EE      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      2-3   time | 7:00am
NF      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      2-4   impact | Low
MS      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      2-5   forecast | 0.4%
HK      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      2-6   previous | -0.7%
DO      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      3 event
OJ      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      3-0   title | Personal Income m/m
FN      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      3-1   country | USD
KR      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      3-2   date | 12-23-2013
NI      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      3-3   time | 1:30pm
QM      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      3-4   impact | Low
RF      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      3-5   forecast | 0.4%
IN      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      3-6   previous | -0.1%
MS      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      4 event
CQ      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      4-0   title | Personal Spending m/m
OR      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      4-1   country | USD
JF      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      4-2   date | 12-23-2013
GM      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      4-3   time | 1:30pm
KG      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      4-4   impact | Medium
NJ      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      4-5   forecast | 0.5%
OP      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      4-6   previous | 0.3%
JH      0       14:38:35.295    Example_Inline_Parsing (AUDCAD,H1)      5 event
....

Автор: Paul van Hemmen

[Удален]  

Я смог скомпилировать и запустить код с первой попытки в моем новом MT5.

  1. 0 проблем с wininet !
  2. Очень хороший код

Отличный вклад! Спасибо.

 

Спасибо за хорошую библиотеку,

Когда я попытался разобрать свой документ методом "Ввод файла", я получил эту ошибку :*** Invalid Character found. Должен быть началом открытого тега P:0 ***.

После головной боли и поисков по всему миру я понял, что кодировка, которую принимает парсер - "UCS-2 LE BOM", поэтому лучше было упомянуть об этом в описании,

Есть ли способ изменить эту кодировку по умолчанию, так как мой XMl Writer использует "UTF-8-BOM"?

 

привет еще раз, я нашел решение для моего случая, может это поможет другим,:)

Я изменил одну строку в функции "CEasyXml::loadXmlFromFile(string pFilename)", принадлежащей классу EasyXML:

 int hFile=FileOpen(pFilename,FILE_READ|FILE_ANSI,CP_UTF8); 

это правильно читает мой файл с форматом кодировки "UTF-8-BOM".

но все еще необходимо удалить символы "BOM "Bytes Of Orders="ï "¿" из строки с помощью :

StringReplace(pText,"",""); 

 

Привет, я пытаюсь получить данные на этой странице: https://www.usda.gov/oce/commodity/wasde/latest.xml, но я получаю эту ошибку с помощью скрипта example_inline_parsing: *** Invalid Character found. Должно быть начало открытого тега P:0 ***
Я просто заменяю оригинальный url на вышеуказанный, а скрипт не работает.

Есть идеи?

Спасибо

 

Привет, Пол.


Спасибо за отличный полезный класс.

Кстати, можно ли сделать глубокую копию объекта CEasyXmlNode с помощью конструктора копирования?

 

Не работает...

Плюс еще ошибки 

sOutput += (ActualNode.getValue()) ? " Value: '" + ActualNode.getValue() + "'" : "";

Возвращает тип string ActualNode.getValue()...

 

Похоже, что существует ошибка, когда используются самозакрывающиеся теги.


Поэтому во многих xml-редакторах при наличии пустого тега он автоматически преобразуется в самозакрывающийся тег. Например.

<element></element> 

становится

<element/>  or  


<element />

автоматически.

И согласно w3 XML elements, использование самозакрывающихся тегов является законным. Поэтому я не понимаю, почему они не поддерживаются при импорте xml-документов. Надеюсь, @Liquinaut сможет решить эту проблему.

К счастью, в моем случае количество самозакрывающихся тегов относительно невелико. Но что, если в документе сотни или тысячи таких тегов. Ожидается, что пользователи будут как-то преобразовывать эти теги в теги open + close?


Редактировать: Для тех, кто хочет преобразовать самозакрывающиеся теги в разделенные теги, вы можете использовать этот RegEx find/replace

Найти: (<)(\w*)(.*)(/>)

Заменить: <$2$3></$2>

[Здесь используется .NET regEx Engine, используемый в TextCrawler3. Другие движки могут использовать другой формат; экспериментируйте]. Сохраняются все атрибуты в исходном теге, если таковые имеются

XML Elements
XML Elements
  • www.w3schools.com
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
 

Здравствуйте, я использую библиотеку, но получаю ошибку в easyxmlnode.mqh о недопустимом указателе в этой функции:

CEasyXmlNode *CEasyXmlNode::createSibling(CEasyXmlNode *pSiblingNode)
  {
   pSiblingNode.Prev(GetPointer(this));
   GetPointer(this).Next(pSiblingNode);

   ParentNode.createChild(pSiblingNode);
   return ParentNode.LastChild();
  }

Вы знаете, как я могу решить эту ошибку?

 
mappi1589 недопустимом указателе в этой функции:

Вы знаете, как я могу решить эту ошибку?

Какой XML вы используете?
 
календарь forex factory calendar xml, он работает почти каждый раз, но случайно выдает эту ошибку. Могу ли я сделать что-то, чтобы избежать этой ошибки или запустить код снова, если он снова обнаружит эту ошибку?