LoadXML MSXML не может загрузить даже правильно сформированный XML - PullRequest
2 голосов
/ 21 января 2010

Я написал оболочку над MSXML на c ++. Метод загрузки выглядит следующим образом. Проблема с кодом в том, что он иногда не может загрузить правильно сформированный xml.

Перед передачей xml в виде строки я выполняю поиск строки для xmlns и заменяю все вхождения xmlns на xmlns: dns. В приведенном ниже коде я удаляю символ bom. Затем я пытаюсь загрузить, используя метод MSXML loadXML. Если загрузка прошла успешно, я устанавливаю пространство имен, как показано в коде.

 Class XmlDocument{

        MSXML2::IXMLDOMDocument2Ptr spXMLDOM;
         ....
    }

// Методы XmlDocument

void XmlDocument::Initialize()
    {

    CoInitialize(NULL);
    HRESULT hr = spXMLDOM.CreateInstance(__uuidof(MSXML2::DOMDocument60));
    if ( FAILED(hr) ) 
    {

        throw "Unable to create MSXML:: DOMDocument object";
    }

}

bool XmlDocument::LoadXml(const char* xmltext)
    {

        if(spXMLDOM != NULL)
        {

            char BOM[3] = {0xEF,0xBB,0xBF};
            //detect unicode BOM character
            if(strncmp(xmltext,BOM,sizeof(BOM)) == 0)
            {
                xmltext += 3;
            }

            VARIANT_BOOL bSuccess = spXMLDOM->loadXML(A2BSTR(xmltext));
            if ( bSuccess == VARIANT_TRUE) 
            {
                spXMLDOM->setProperty("SelectionNamespaces","xmlns:dns=\"http://www.w3.org/2005/Atom\"");

                return true;
            }
        }
        return false;

    }

Я пытался отладить, все еще не мог понять, почему иногда loadXML () не может загрузить даже правильно сформированные xmls. Что я делаю не так в коде. Любая помощь с благодарностью.

Спасибо Jeez

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

Для этой конкретной проблемы, пожалуйста, обратитесь к Строки, переданные в loadXML, должны быть в кодировке USTF-16 BSTR .

В целом, синтаксический анализатор xml не предназначен для анализа строк памяти, например loadXML не распознает спецификацию и имеет ограничения по кодированию. Скорее, xml-анализатор предназначен для формы байтового массива с определением кодировки, что является критичным для стандартного анализатора. Чтобы лучше использовать MSXML, рассмотрите возможность загрузки из IStream или файла Win32.

2 голосов
/ 21 января 2010

Я не фанат A2BSTR - по крайней мере, вы теряете память, поскольку возвращаемый BSTR никогда не освобождается.

Вы могли бы так же легко

      VARIANT_BOOL bSuccess = spXMLDOM->loadXML(CComBSTR(xmltext));

Который будет правильно обрабатывать память.

Что касается причины его сбоя - вы можете запросить DOMDocument для его объекта parseError IXMLDOMParseError, а затем извлечь из него причину - это, вероятно, пролит больше света на реальную проблему.

0 голосов
/ 12 августа 2010

Мы используем

hr = m_pXMLDoc->load(_variant_t(xml_file.c_str()), &varStatus);
hr = m_pXMLDoc->loadXML(_bstr_t(xml_doc.c_str()), &varStatus);

Для загрузки файлов и необработанного XML соответственно.

...