Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Разделение текста...

290
12 января 2011 года
Patr1ot
458 / / 09.02.2008
Есть текст такого вида:

<CounterIn>0</CounterIn>

из него в переменную надо отсеять только число между скобками.

Как это сделать никто не подскажет?
11
12 января 2011 года
oxotnik333
2.9K / / 03.08.2007
Вопрос задан с эдакой подковыркой, ибо если прямо его задать, то обязательно пошлют читать про TXMLDocument.
PS: Товарищ, довай жги, ты это умеешь!
33K
12 января 2011 года
hivewarrior
205 / / 16.11.2010
Парсить как XML нэ?
XMLDocument тебе в помощь. Там есть функция, которая как раз таки выдергивает текст между тегами, а уж потом делай с ним все, что хочешь.
290
12 января 2011 года
Patr1ot
458 / / 09.02.2008
[HTML]Вопрос задан с эдакой подковыркой, ибо если прямо его задать, то обязательно пошлют читать про TXMLDocument.[/HTML]

Блин, а как то работает, вот форма закинул на нее XMLDocument1
Указал имя файла:
 
Код:
XMLDocument1->FileName="C:\\Users\\Администратор\\Desktop\\BER_Anuch_3_Enter.xml";

А какой функцией из компоненты XMLDocument1 считать данные без тегов?
Чтобы уже без тегов загрузить текст в Memo1 например.
PS:Ну как отжог?
33K
12 января 2011 года
hivewarrior
205 / / 16.11.2010
GetNodeValue() - метод класса _di_IXMLNode
Пробегаешься по всем узлам в коллекции, находишь свой по каким-то признакам, используешь GetNodeValue().
290
12 января 2011 года
Patr1ot
458 / / 09.02.2008
Блинн да это ппц...

http://revolution.allbest.ru/programming/00132359_0.html

Неужели нет функции с помощью которой можно просто убрать все теги?
Мне собстно это и надо, загрузить Xml файл в Memo но без Тэгов.
33K
12 января 2011 года
hivewarrior
205 / / 16.11.2010
Делаешь рекурсивную функцию для формы.
Эта функция проверяет, есть ли Потомки у узла. Если есть, запускает себя, передавая в параметре узел, у которого потомки. Если нет, то вываливает GetNodeValue() и сканирует дальше.
290
12 января 2011 года
Patr1ot
458 / / 09.02.2008
Я неработал никогда с XML, может подробней подскажеш. Как я понял
Создаю новую функцию и циклом перебираю строки документа?
Или ты имел в виду
<тэг>0<тэг> - Узел
<тэг>1<тэг> - потомок узла
раз больше потомков нет выводит значение в теге потомка?
А результат выводит с тегом или без?
33K
12 января 2011 года
hivewarrior
205 / / 16.11.2010
 
Код:
<тег>
     <тегпотомок>
          0
     </тегпотомок>
    1
</тег>
<другойтег>
    2
</другойтег>

Если не понятно, то почитай спецификации на XML, с XML удобнее работать как с XML, а не как с текстом.
Хотя есть топорный метод на основе AnsiString и Pos/Substring соответственно, но лучше научись работать с XML, полезно для общего развития.
290
12 января 2011 года
Patr1ot
458 / / 09.02.2008
попытаюсь
11
12 января 2011 года
oxotnik333
2.9K / / 03.08.2007
может вот это поможет, хотя сомневаюсь
PS: аффтар жги дальше
290
12 января 2011 года
Patr1ot
458 / / 09.02.2008
Нашел код, немного модернизировал под себя:

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try {
        XMLDocument1->CleanupInstance();
        XMLDocument1->LoadFromFile("C:\\Users\\Администратор\\Desktop\\BER_Anuch_3_Enter.xml");
        XMLDocument1->Active = true;
        _di_IXMLNode Storage = XMLDocument1->ChildNodes->Get(1);

        int count = Storage->ChildNodes->Count;
        for (int i = 0; i < count; i++) {
            _di_IXMLNode Tpl = Storage->ChildNodes->Nodes;
            _di_IXMLNode StorageEnter = Tpl->ChildNodes->Nodes[WideString( "StorageEnter" ) ];
            _di_IXMLNode CounterIn = StorageEnter->ChildNodes->Nodes[WideString( "CounterIn" ) ];
            AnsiString TmpStr = CounterIn->GetNodeValue();
            Label1->Caption=TmpStr;
        }
        XMLDocument1->Active = false;
    } catch (Exception &ex) {
        Application->ShowException(&ex);
    }
}


При компиляции ошибки не дал, Пытаюсь вывести значение CounterIn Вылетает ошибка "Cloud not convert variant of type (NULL) into type (String)", вроде как ошибка конвентирования из одного типа NULL в текст.
Но я вроде нигде ничего не конвентировал.




вот сам xml код:
[HTML]
<?xml version="1.0" standalone="yes"?>
<Storage>
<xs:schema id="Storage" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Storage" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="StorageEnter">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:int" minOccurs="0" />
<xs:element name="CounterIn" type="xs:int" minOccurs="0" />
<xs:element name="CounterOut" type="xs:int" minOccurs="0" />
<xs:element name="CounterUnknown" type="xs:int" minOccurs="0" />
<xs:element name="DateTime" type="xs:dateTime" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<StorageEnter>
<ID>455190815</ID>
<CounterIn>2</CounterIn>
<CounterOut>0</CounterOut>
<CounterUnknown>0</CounterUnknown>
<DateTime>2011-01-12T11:30:00+05:00</DateTime>
</StorageEnter>
<StorageEnter>
<ID>455190815</ID>
<CounterIn>0</CounterIn>
<CounterOut>0</CounterOut>
<CounterUnknown>0</CounterUnknown>
<DateTime>2011-01-12T11:31:00+05:00</DateTime>
</StorageEnter>
<StorageEnter>
<ID>455190815</ID>
<CounterIn>0</CounterIn>
<CounterOut>0</CounterOut>
<CounterUnknown>0</CounterUnknown>
<DateTime>2011-01-12T11:32:00+05:00</DateTime>
</StorageEnter>
<StorageEnter>
[/HTML]
33K
12 января 2011 года
hivewarrior
205 / / 16.11.2010
 
Код:
AnsiString TmpStr = CounterIn->GetNodeValue();

А тип кто вместо тебя будет приводить? Там вариант, а с другой стороны стринг. Вот и ругается, что типы не приведены.
7
12 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: hivewarrior
Хотя есть топорный метод на основе AnsiString и Pos/Substring соответственно, но лучше научись работать с XML, полезно для общего развития.

Вообще-то только это афтору и поможет.Особенно если ему только из тегов надо данные считать

290
17 января 2011 года
Patr1ot
458 / / 09.02.2008
Цитата: hivewarrior
 
Код:
AnsiString TmpStr = CounterIn->GetNodeValue();

А тип кто вместо тебя будет приводить? Там вариант, а с другой стороны стринг. Вот и ругается, что типы не приведены.



Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try {
        XMLDocument1->CleanupInstance();
        XMLDocument1->LoadFromFile("C:\\Users\\&#192;&#228;&#236;&#232;&#237;&#232;&#241;&#242;&#240;&#224;&#242;&#238;&#240;\\Desktop\\BER_Anuch_3_Enter.xml");
        XMLDocument1->Active = true;
        _di_IXMLNode Storage = XMLDocument1->ChildNodes->Get(1);

        int count = Storage->ChildNodes->Count;
        for (int i = 40; i < count; i++) {
            _di_IXMLNode Tpl = Storage->ChildNodes->Nodes;
            _di_IXMLNode StorageEnter = Tpl->ChildNodes->Nodes[WideString( "StorageEnter" ) ];
            _di_IXMLNode CounterIn = StorageEnter->ChildNodes->Nodes[WideString( "CounterIn" ) ];
            int t;
            AnsiString TmpStr;
            CounterIn->GetNodeValue().ChangeType(t);
            TmpStr=IntToStr(t);
            Memo1->Lines->Add(TmpStr.c_str());
        }
        XMLDocument1->Active = false;
    } catch (Exception &ex) {
        Application->ShowException(&ex);
    }
}

Сделал вот так, вообще ничего непроисходит...?
в Memo1 ничего не выводится.
что делать?
33K
17 января 2011 года
hivewarrior
205 / / 16.11.2010
Цитата: Patr1ot
 
Код:
...
            int t;
            AnsiString TmpStr;
            CounterIn->GetNodeValue().ChangeType(t);
            TmpStr=IntToStr(t);
            Memo1->Lines->Add(TmpStr.c_str());
            ...


Мои глаза:eek:
Привидение типов с помощью конструктора AnsiString(Variant) нэ?

1
17 января 2011 года
kot_
7.3K / / 20.01.2000
ВНЕЗАПНО тема закрыта.
автор - читать справку.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог