MSXML + VC++
От: John1979  
Дата: 16.07.02 09:14
Оценка:
такая значит проблема
нужно создать новый XML
и прописать в нем кодировку UTF-8
делаю
CComPtr<IXMLDOMNode> iTN;
iXMLDoc->createNode( CComVariant(NODE_PROCESSING_INSTRUCTION), L"xml", NULL, &iTN )
тут S_OK
далее
CComPtr<IXMLDOMnode> iXMLItem;
iXMLDoc->appendChild( iTN, &iXMLItem );
тут тоже все ок
на текущий момент в XML уже есть <?xml version='1.0'?>
пытаюсь у нода iXMLItem установить attribute encoding
говорит S_OK
на деле - ничего не добавляется

если делать через
iXMLDoc->createProcessingInstruction
передавая ему первым параметром "xml" вторым "version='1.0'"
он возвращает HRESULT = 1


кто может подсказать — в чем грабли ?
Re: MSXML + VC++
От: Lloyd Россия  
Дата: 16.07.02 09:44
Оценка:
Здравствуйте John1979, Вы писали:


J>кто может подсказать — в чем грабли ?


Дело в том, что
<?xml version="1.0" ?>

не есть processing instruction

Это xml declaration.

Вот определение PI


PI ::= ’<?’ PITarget  (S  (Char  * - (Char  * ’?>’ Char  *)))? ’?>’
PITarget ::= Name  - ((’X’ | ’x’) (’M’ | ’m’) (’L’ | ’l’))
Re[2]: MSXML + VC++
От: Аноним  
Дата: 16.07.02 09:55
Оценка:
Здравствуйте Lloyd, Вы писали:

L>Здравствуйте John1979, Вы писали:



J>>кто может подсказать — в чем грабли ?


L>Дело в том, что

L>
L><?xml version="1.0" ?> 
L>

L>не есть processing instruction

L>Это xml declaration.


L>Вот определение PI



L>
L>PI ::= ’<?’ PITarget  (S  (Char  * - (Char  * ’?>’ Char  *)))? ’?>’
L>PITarget ::= Name  - ((’X’ | ’x’) (’M’ | ’m’) (’L’ | ’l’))
L>


эээ...
а можно чуть чуть подробней
или расписать, что значат эти записи ?
а то я чес говоря малость не понял ничего

буду премного благодарен, если Вы еще и подскажете, как мне добавить
кодировку в текст документа
Re[3]: MSXML + VC++
От: Lloyd Россия  
Дата: 16.07.02 11:03
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Lloyd, Вы писали:


L>>Здравствуйте John1979, Вы писали:


J>>>кто может подсказать — в чем грабли ?


А>эээ...

А>а можно чуть чуть подробней
А>или расписать, что значат эти записи ?
А>а то я чес говоря малость не понял ничего

А>буду премного благодарен, если Вы еще и подскажете, как мне добавить

А>кодировку в текст документа

Дока говорит, что

Character encoding is based on the encoding attribute in the XML declaration, 
such as <?xml version="1.0" encoding="windows-1252"?>. When no encoding 
attribute is specified, the default setting is UTF-8.


Судя по всему сказать парсеру в какой кодировке сохранять нельзя. Хотя точно говорить не могу ...
Re[4]: MSXML + VC++
От: Lexey Россия  
Дата: 16.07.02 17:01
Оценка:
Здравствуйте Lloyd, Вы писали:

L>Судя по всему сказать парсеру в какой кодировке сохранять нельзя. Хотя точно говорить не могу ...


attributes Property

This value depends on the value of the nodeType property.

NODE_PROCESSING_INSTRUCTION Returns null for all processing instructions except the XML declaration, for example,
<?xml version="1.0" encoding="windows-1252" standalone="yes" ?>.
For the XML declaration, the version, encoding, and standalone specifications can be accessed as attributes from the corresponding node.

Т.е. encoding должен быть доступен как обычный атрибут XMLDOMDocument'а.
Re[5]: MSXML + VC++
От: Lloyd Россия  
Дата: 16.07.02 17:28
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте Lloyd, Вы писали:


L>>Судя по всему сказать парсеру в какой кодировке сохранять нельзя. Хотя точно говорить не могу ...


L>attributes Property


L>This value depends on the value of the nodeType property.


L>NODE_PROCESSING_INSTRUCTION Returns null for all processing instructions except the XML declaration, for example,

L><?xml version="1.0" encoding="windows-1252" standalone="yes" ?>.
L>For the XML declaration, the version, encoding, and standalone specifications can be accessed as attributes from the corresponding node.

L>Т.е. encoding должен быть доступен как обычный атрибут XMLDOMDocument'а.



В документации по MSXML4 есть пример, в котором <?xml создается как PI.
Хотя в стандарте явно написано, что PI!=xml declaration.
Re: MSXML + VC++
От: Slayer Россия  
Дата: 17.07.02 02:29
Оценка:
Здравствуйте John1979, Вы писали:

J>кто может подсказать — в чем грабли ?


На сколько я помню если у XMLDocument запросить firstChild — он вернет заголовок(declaration). Попробуй у него установить атрибут encoding.
Re: MSXML + VC++
От: John1979  
Дата: 17.07.02 03:20
Оценка:
вот, значит, заработало через создание ноды, с флагом
NODE_PROCESS_...
но работает только. если ему передать encoding=UTF-16
х.з. что за дела такие
причем после сохранения там оказывается UTF-8
Re[6]: MSXML + VC++
От: shrek  
Дата: 29.08.03 08:27
Оценка:
L>В документации по MSXML4 есть пример, в котором <?xml создается как PI.
L>Хотя в стандарте явно написано, что PI!=xml declaration.
а можно поподробнее. в каком месте документации — что смотреть.
я столкнулся с подобной проблемой — создаю XML документ — и никак не получается нарисовать сверху <?xml .... >
Re: MSXML + VC++
От: Юнусов Булат Россия  
Дата: 01.09.03 10:54
Оценка: 3 (1)
Здравствуйте, John1979, Вы писали:

Попробуй так
    CComPtr<IXMLDOMDocument> pDoc;
    hr = pDoc.CoCreateInstance(__uuidof(DOMDocument));
    ATLASSERT(SUCCEEDED(hr));
    if (FAILED(hr)) {
        return hr;
    }

    CComPtr<IXMLDOMProcessingInstruction> pProcessingInstruction;
    hr = pDoc->createProcessingInstruction(L"xml", L"version='1.0' encoding='windows-1251'", &pProcessingInstruction);
    ATLASSERT(SUCCEEDED(hr));
    if (FAILED(hr)) {
        return hr;
    }

    hr = pDoc->appendChild(pProcessingInstruction, NULL);
    ATLASSERT(SUCCEEDED(hr));
    if (FAILED(hr)) {
        return hr;
    }
Re[2]: MSXML + VC++
От: shrek  
Дата: 02.09.03 06:42
Оценка:
ЮБ>Здравствуйте, John1979, Вы писали:
не знаю как John1979, а мою проблему это решило!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.