Имя: Пароль:
1C
 
Ошибка при попытке построить DOM по тексту HTML
0 TormozIT
 
23.04.23
09:44
Выполняю код

	ПостроительDOM = Новый ПостроительDOM(); 
	ЧтениеHTML = Новый ЧтениеHTML;
	ЧтениеHTML.УстановитьСтроку(Текст);
	ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	ЗаписьDOM = Новый ЗаписьDOM;
	ЗаписьDOM.Записать(ДокументHTML.Тело, ЗаписьXML);
	ТекстХМЛ = ЗаписьXML.Закрыть();
	ЧтениеXML = Новый ЧтениеXML();
	ЧтениеXML.УстановитьСтроку(ТекстХМЛ);
	ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);


Получаю ошибку

Ошибка разбора XML:  - [16,9]
Ошибка:
Namespace prefix o on p is not defined


Как найти и прописать все нужные соответствия пространств имен?

Текст HTML (вырезка):

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1251">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 15">
<meta name=Originator content="Microsoft Word 15">
<link rel=File-List
href="Запрос%20на%20создание%20клиента%20№14557%20перешел%20в%20новый%20статус%20%20New%20status%20of%20Customer%20request%20add%20№14557%20html.files/filelist.xml">
<link rel=Edit-Time-Data
href="Запрос%20на%20создание%20клиента%20№14557%20перешел%20в%20новый%20статус%20%20New%20status%20of%20Customer%20request%20add%20№14557%20html.files/editdata.mso">
</head>
<body lang=RU link=blue vlink=purple style='tab-interval:35.4pt'>
<div class=WordSection1>
<p class=MsoNormal style='margin-left:120.0pt;text-indent:-120.0pt;tab-stops:
120.0pt;mso-layout-grid-align:none;text-autospace:none'><b><span
style='font-family:"Calibri",sans-serif;color:black'>От</span></b><b><span
lang=EN-US style='font-family:"Calibri",sans-serif;color:black;mso-ansi-language:
EN-US'>:<span style='mso-tab-count:1'>								   </span></span></b><span
lang=EN-US style='font-family:"Calibri",sans-serif;color:black;mso-ansi-language:
EN-US'>[email protected]<o:p></o:p></span></p>
</span></div>
</div>
</body>
</html>


Текст XML:

<body lang="RU" link="blue" vlink="purple" style="tab-interval:35.4pt">
<div class="WordSection1">
<p class="MsoNormal" style="margin-left:120.0pt;text-indent:-120.0pt;tab-stops:
120.0pt;mso-layout-grid-align:none;text-autospace:none">
			<b>
				<span style="font-family:"Calibri",sans-serif;color:black">От</span>
			</b>
			<b>
				<span lang="EN-US" style="font-family:"Calibri",sans-serif;color:black;mso-ansi-language:
EN-US">:
					<span style="mso-tab-count:1">								   </span>
				</span>
			</b>
			<span lang="EN-US" style="font-family:"Calibri",sans-serif;color:black;mso-ansi-language:
EN-US">[email protected]
				<o:p/>
			</span>
		</p>
</div>
</body>
1 TormozIT
 
23.04.23
22:12
Методом тыка прописал пространства так

ПостроительDOM = Новый ПостроительDOM();
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ТекстХМЛ);
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("html");
Для Каждого Атрибут Из ДокументHTML.ПолучитьЭлементыПоИмени("html")[0].Атрибуты Цикл
    Если Атрибут.ЛокальноеИмя = "xmlns" Тогда
        Продолжить;
    КонецЕсли;
    ИмяПрост = ирОбщий.ПоследнийФрагментЛкс(Атрибут.ЛокальноеИмя, ":");
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(ИмяПрост, Атрибут.Значение);
КонецЦикла;
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументHTML.Тело, ЗаписьXML);
ЗаписьXML.ЗаписатьКонецЭлемента();
ТекстХМЛ2 = ЗаписьXML.Закрыть();
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(ТекстХМЛ2);
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
2 TormozIT
 
23.04.23
22:30
Попутно нашел ошибку во всех платформах при вставке текста скопированного из этой темы =)
https://www.hostedredmine.com/issues/962459
3 Asmody
 
24.04.23
09:48
(2) ворд навтыкал своих стилей: mso-ansi-language, mso-layout-grid-align и т.д.
И ещё более чем содержательных кусков, типа <o:p></o:p>
4 Lyekka
 
24.04.23
10:52
Соглашусь с Asmody.
Тут нужно не пространство имен подыскивать, а код чистить от лишних определений, тегов и атрибутов.
5 TormozIT
 
24.04.23
14:43
Мне нужно было как всегда универсальное решение. И оно было достигнуто в достаточной мере https://www.hostedredmine.com/issues/962306
А "код чистить" - это удел частных случаев.