Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > проблемы потери пробела при загрузки из xml


Автор: informn 22.9.2006, 21:44
Есть xml файл и нужно загрузить из него данные.
Файл имеет примерно следующий формат:
Код

<LV3>
                <GEO>Am </GEO>
                <SFA>afdf  </SFA>
                <EXA>df df 1</EXA>
</LV3


Очень важны пробелы, что идут в конце каждой записи.

Используется примерно вот такой код:
Код

IXMLDOMDocument2Ptr pXMLDoc;
HRESULT hr;
pXMLDoc.CreateInstance( "msxml2.domdocument" );
//загрузка xml-файла
hr=pXMLDoc->load( CComVariant( sFileName.c_str() ));

MSXML2::IXMLDOMElementPtr RootElement;

MSXML2::IXMLDOMNodeListPtr ChildNodesOfRootElement;
MSXML2::IXMLDOMNodeListPtr ListOfArticles;
MSXML2::IXMLDOMNodeListPtr ListOfLevels;
MSXML2::IXMLDOMNodeListPtr ListOfNodes;
//MSXML2::IXMLDOMNodeListPtr ;

MSXML2::IXMLDOMNodePtr MainNode;
MSXML2::IXMLDOMNodePtr ArticleNode;
MSXML2::IXMLDOMNodePtr LevelNode;
MSXML2::IXMLDOMNodePtr Node;
MSXML2::IXMLDOMNodePtr ArticleVal;
//MSXML2::IXMLDOMNodePtr ;

MSXML2::IXMLDOMNamedNodeMapPtr ArticleAttributes;

int nListOfArticles;
int nListOfLevels;
int nListOfNodes;

_bstr_t textLevel;
_bstr_t text;
BSTR textBSTR;

!!! далее следует немного кода, где мы добираеся до нужного значения.



ListOfLevels=ArticleNode->childNodes;

nListOfLevels=ListOfLevels->length;

for (int iLevel=0; iLevel<nListOfLevels; iLevel++)
    {
            tmpNode.sLevel="";
        //считываем номер уровня
        LevelNode=ListOfLevels->item[iLevel];
        textLevel=LevelNode->nodeName;
        tmpNode.sLevel=textLevel;

        //загружаем список Node
        ListOfNodes=LevelNode->childNodes;
        nListOfNodes=ListOfNodes->length;
            
            for (int iNode=0; iNode<nListOfNodes; iNode++)
                {
                    tmpNode.sNode="";
                    tmpNode.sType="";
                    Node=ListOfNodes->item[iNode];
                    // в Node содержится сама запись, за исключением случаев с box.
                    
                    text=Node->nodeName;        //название поля
                    tmpNode.sType=text;
                    
                    Node->get_text(&textBSTR);    //само поле
                    
                    //text=Node->nodeValue;
                    text=(_bstr_t) Node->Gettext();
                    text=textBSTR;
                    tmpNode.sNode=text;
                    article.vNodes.push_back(tmpNode);



                }

В конце кода, происходит загрузка значений <GEO>Am </GEO> и т.д.
Так вот в этих значениях теряется последний пробел, а он очень нужен.
Как сделать так, чтобы не терялся этот пробел?

Компилятор Microsoft Visual C++ 2005   

Автор: _hunter 25.9.2006, 10:57
никак. это неправильный XML поэтому он неправильно парсится. для разбора этого файла нужно писать свой парсер.

Автор: informn 25.9.2006, 19:49
Почему неправильный?

Автор: _hunter 26.9.2006, 10:22
потому как в правильном не должно быть лидирующих/завершающих пробелов...

Автор: Bishop 28.9.2006, 07:29
informn,
Вот здесь теряются завершающие пробелы:
Цитата(informn @  22.9.2006,  21:44 Найти цитируемый пост)
 Node->get_text(&textBSTR);    //само поле

А вот так не теряются:
Код

    VARIANT a;
    Node->get_nodeValue(&a);
    textBSTR = a.bstrVal;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)