Разделение текста...
<CounterIn>0</CounterIn>
из него в переменную надо отсеять только число между скобками.
Как это сделать никто не подскажет?
PS: Товарищ, довай жги, ты это умеешь!
XMLDocument тебе в помощь. Там есть функция, которая как раз таки выдергивает текст между тегами, а уж потом делай с ним все, что хочешь.
Блин, а как то работает, вот форма закинул на нее XMLDocument1
Указал имя файла:
Код:
XMLDocument1->FileName="C:\\Users\\Администратор\\Desktop\\BER_Anuch_3_Enter.xml";
А какой функцией из компоненты XMLDocument1 считать данные без тегов?
Чтобы уже без тегов загрузить текст в Memo1 например.
PS:Ну как отжог?
Пробегаешься по всем узлам в коллекции, находишь свой по каким-то признакам, используешь GetNodeValue().
http://revolution.allbest.ru/programming/00132359_0.html
Неужели нет функции с помощью которой можно просто убрать все теги?
Мне собстно это и надо, загрузить Xml файл в Memo но без Тэгов.
Эта функция проверяет, есть ли Потомки у узла. Если есть, запускает себя, передавая в параметре узел, у которого потомки. Если нет, то вываливает GetNodeValue() и сканирует дальше.
Создаю новую функцию и циклом перебираю строки документа?
Или ты имел в виду
<тэг>0<тэг> - Узел
<тэг>1<тэг> - потомок узла
раз больше потомков нет выводит значение в теге потомка?
А результат выводит с тегом или без?
Код:
<тег>
<тегпотомок>
0
</тегпотомок>
1
</тег>
<другойтег>
2
</другойтег>
<тегпотомок>
0
</тегпотомок>
1
</тег>
<другойтег>
2
</другойтег>
Если не понятно, то почитай спецификации на XML, с XML удобнее работать как с XML, а не как с текстом.
Хотя есть топорный метод на основе AnsiString и Pos/Substring соответственно, но лучше научись работать с XML, полезно для общего развития.
попытаюсь
вот это поможет, хотя сомневаюсь
PS: аффтар жги дальше
может
PS: аффтар жги дальше
Код:
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);
}
}
{
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]
Код:
AnsiString TmpStr = CounterIn->GetNodeValue();
А тип кто вместо тебя будет приводить? Там вариант, а с другой стороны стринг. Вот и ругается, что типы не приведены.
Цитата: hivewarrior
Хотя есть топорный метод на основе AnsiString и Pos/Substring соответственно, но лучше научись работать с XML, полезно для общего развития.
Вообще-то только это афтору и поможет.Особенно если ему только из тегов надо данные считать
Цитата: hivewarrior
Код:
AnsiString TmpStr = CounterIn->GetNodeValue();
А тип кто вместо тебя будет приводить? Там вариант, а с другой стороны стринг. Вот и ругается, что типы не приведены.
Код:
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 = 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);
}
}
{
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 = 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 ничего не выводится.
что делать?
Цитата: Patr1ot
Код:
...
int t;
AnsiString TmpStr;
CounterIn->GetNodeValue().ChangeType(t);
TmpStr=IntToStr(t);
Memo1->Lines->Add(TmpStr.c_str());
...
int t;
AnsiString TmpStr;
CounterIn->GetNodeValue().ChangeType(t);
TmpStr=IntToStr(t);
Memo1->Lines->Add(TmpStr.c_str());
...
Мои глаза:eek:
Привидение типов с помощью конструктора AnsiString(Variant) нэ?
автор - читать справку.