1с фатальная ошибка entityref expecting

Как получить ДокументDOM из HTML — страницы? ☑ 0

ВаликТР

15.07.15

14:58

Есть код

ЧтениеХТМЛ = Новый ЧтениеHTML();

Дом = Новый ПостроительDOM;    

ЧтениеХТМЛ.УстановитьСтроку(Тело);

Док = Дом.Прочитать(ЧтениеХТМЛ);

Получаем Док тип ДокументHTML/

А каким образом получить в результате ДокументDOM, чтобы потом xPath можно было использовать?

1

Asmody

15.07.15

15:26

ЧтениеHTML = Новый ЧтениеHTML;

    ЧтениеHTML.ОткрытьФайл(ИмяФайла, «UTF-8»);

    ПостроительDOM = Новый ПостроительDOM;

    ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);

    ЗаписьXML = Новый ЗаписьXML;

    ЗаписьXML.УстановитьСтроку(«UTF-8»);

    ЗаписьDOM = Новый ЗаписьDOM;

    ЗаписьDOM.Записать(ДокументHTML.Тело, ЗаписьXML);

    ЧтениеXML = Новый ЧтениеXML;

    ЧтениеXML.УстановитьСтроку(ЗаписьXML.Закрыть());

    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);

    Разименовыватель = Новый РазыменовательПространствИменDOM(ДокументDOM);

    ВыражениеXPath = «//tr/td[@class=»»s23″»]/../td[@class=»»s23″»] | //tr/td[@class=»»s23″»]/../td[@class=»»s11″»]»;

    РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ВыражениеXPath, ДокументDOM, Разименовыватель);

2

Asmody

15.07.15

15:28

и вы еще сомневаетесь, что платформу пишут «чужие для хищников»?

3

ВаликТР

15.07.15

16:24

(1) Спасибо за помощь (дожить бы до ее конца!)

Но на этой строке

ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);

Ошибка разбора XML:  — [32,43]

Фатальная ошибка:

EntityRef: expecting ‘;’

Что нужно проверить?

4

DmitrO

15.07.15

16:32

ПостроительDOM.Прочитать

может сразу принимать ЧтениеHTML

5

DmitrO

15.07.15

16:33

аа, xpath.. сори туплю :)

6

Лефмихалыч

15.07.15

16:53

(2) это на самом деле весьма по-русски — игла в яйце, яйцо в утке, утка в зайце. Традиции у нас крепки просто

7

trad

15.07.15

16:55

(6) заяц в шоке

8

Asmody

15.07.15

17:03

(3) Можно как-то почистить ДокументHTML.Тело, например, натравить на него НайтиНедопустимыеСимволыXML()

9

Serginio1

15.07.15

17:19

10

Гёдза

15.07.15

17:24

(1) А так разве нет

ЧтениеHTML = Новый ЧтениеHTML;

    ЧтениеHTML.ОткрытьФайл(ИмяФайла, «UTF-8»);

    ПостроительDOM = Новый ПостроительDOM;

    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеHTML);

     Разименовыватель = Новый РазыменовательПространствИменDOM(ДокументDOM);

    ВыражениеXPath = «//tr/td[@class=»»s23″»]/../td[@class=»»s23″»] | //tr/td[@class=»»s23″»]/../td[@class=»»s11″»]»;

    РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ВыражениеXPath, ДокументDOM, Разименовыватель);

11

Asmody

15.07.15

17:26

(9) Там про шарп, а у нас про 1С.

12

Asmody

15.07.15

17:31

(10) При чтении из ЧтениеHTML ПостроительDOM возвращает ДокументHTML. В документации про это очень мутно написано, проверено отладчиком.

13

Serginio1

15.07.15

17:33

(11) Шарп элементарно к 1С прикручивается.

14

Asmody

15.07.15

17:34

(13) Ваши костыли оставьте при себе.

15

Serginio1

15.07.15

17:37

(14) Активно ими пользуюс, а вы инвалиды пилите ПостроительDOM , золотом уже пахнет

16

Котокот

15.07.15

17:39

А какая разница между ДокументDOM и ДокументHTML?

17

Asmody

15.07.15

18:02

(15) Ненативно — это раз, необходимость тащить ради пары функций полгигабайта .NET со своими тараканами — это два.

18

Serginio1

15.07.15

18:09

(17) Вообще то Microsoft.NET почти 2 ГБ. Но он уже установлен на всех Win7 и выше.

А зачем мне натив? У меня линуксов нет и не придвидется.

Но я на раз сделаю кучу вещей, на что 1С не способен как в 7ке так и в 8 ке.

19

Котокот

15.07.15

20:44

Я почему спрашивал в чем разница. Сам вот так делаю:

    ЧтениеHTML        = Новый ЧтениеHTML;

    ЧтениеHTML.УстановитьСтроку(СтрокаШаблона.ШаблонТекстHTML);

    ПостроительDOM    = Новый ПостроительDOM;

    ШаблонDOM        = ПостроительDOM.Прочитать(ЧтениеHTML);

Цитата из СП:

ПостроительDOM.Прочитать (DOMBuilder.Read)

ПостроительDOM (DOMBuilder)

Прочитать (Read)

Синтаксис:

Прочитать(<ИсточникДанныхXML>)

Параметры:

<ИсточникДанныхXML> (обязательный)

Тип: ЧтениеУзловDOM, ЧтениеFastInfoset, ЧтениеXML; ЧтениеHTML.

Объект чтения данных XML или чтения данных HTML.

Возвращаемое значение:

Тип: ДокументDOM.

Описание:

Создает документ DOM. Производит чтения документа XML из источника данных XML.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

Примечание:

Параметры DOM в созданный документ не переносятся.

Там написано, что возвращаемое значение — ДокументDOM. В Отладчике смотрю — у меня ДокументHTML. Все в нем нормально разбирается, изменяется и т.д. И никаких неудобств не испытываю. Так может я чего-то не знаю? Может мне с DOM будет лучше? Объясните нубу, ЧЯДНТ?

20

Котокот

15.07.15

20:46

Может у меня не DOM а HTML потому что в тексте документа в начале стоит

<!DOCTYPE html PUBLIC «-//W3C//DTD HTML 4.0 Transitional//EN»>?

И все-таки, в чем разница то?

21

ВаликТР

15.07.15

23:16

(20) ДокументHTML в ДокументDOM не работает с xPath. Поэтому мне и нужен ДокументDOM.

22

ВаликТР

15.07.15

23:18

ПостроительDOM.Прочитать(ЧтениеHTML) возвращает ДокументHTML

ПостроительDOM.Прочитать(ЧтениеXML) возвращает ДокументDOM

23

Котокот

16.07.15

11:00

(22) А если ему в заголовке подменить html на xml?

Добрый день. Нужно с парсить информацию о штрих коде.
То есть к товару подносим штрихкод и получаем с сайта название товара.
Мною был написан следующий код:

ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл(ИмяФайла, "UTF-8"); (//ИмяФайла --- содержание HTML Страницы)
ПостроительDOM = Новый ПостроительDOM;
    ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку("UTF-8");
    ЗаписьDOM = Новый ЗаписьDOM;
    ЗаписьDOM.Записать(ДокументHTML.Тело, ЗаписьXML);
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ЗаписьXML.Закрыть());
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    Разименовыватель = Новый РазыменовательПространствИменDOM(ДокументDOM);
    ВыражениеXPath = "//tr/td[@class=""s23""]/../td[@class=""s23""] | //tr/td[@class=""s23""]/../td[@class=""s11""]";

РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ВыражениеXPath, ДокументDOM, Разименовыватель);

В строке ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); Выдает ошибку:

ЦитироватьОшибка разбора XML:  — [32,43]
Фатальная ошибка:
EntityRef: expecting ‘;’

НУЖЕНО ПОЛУЧИТЬ ИНФОРМАЦИЮ ПО xPath

Вопрос:
1. Почему не хочет создаваться ДокументDom?
2. Как исправить данную ситуацию?
Заранее спасибо.

Your URL must be escaped.

& character is used in XML to insert a character reference with syntax &name; (note ; after name). Parser expects a ; but it can’t find it (there are more available delimiters, this is just most common case).

Solution is then escaping (how it’s done depends on language you use to generate that XML file) but final result must be something like this:

<url>
  <loc>http://www.ezed.in/ezed/courseDemoIntroPage.do?courseId=COU10000000138003530&amp;checkingCourseFrom=preLogin#.U2DcKvmSySo</loc>
</url>

Note that plain & has been replaced with its escaped version &amp;. For further details see this simple article.

Another possible solution (if you don’t want/you can’t escape) is to enclose URL inside a CDATA section like this:

<url>
  <loc><![CDATA[http://www.ezed.in/ezed/courseDemoIntroPage.do?courseId=COU10000000138003530&checkingCourseFrom=preLogin#.U2DcKvmSySo]]></loc>
</url>

<url>
  <loc>http://www.ezed.in/ezed/courseDemoIntroPage.do?courseId=COU10000000138003530&checkingCourseFrom=preLogin#.U2DcKvmSySo</loc>
</url>

ошибка в строке 102 в столбце 103: EntityRef: ожидание ‘;’

Не удалось выяснить, в чем проблема.

4b9b3361

Ответ 1

Ваш URL-адрес должен быть экранирован.

Символ

& используется в XML для вставки символьной ссылки с синтаксисом &name; (примечание ; после имени). Parser ожидает ;, но он не может его найти (есть более доступные разделители, это самый распространенный случай).

Решение затем экранируется (как это делается, зависит от языка, который вы используете для создания этого XML файла), но конечный результат должен быть примерно таким:

<url>
  <loc>http://www.ezed.in/ezed/courseDemoIntroPage.do?courseId=COU10000000138003530&amp;checkingCourseFrom=preLogin#.U2DcKvmSySo</loc>
</url>

Обратите внимание, что обычная & была заменена ее экранированной версией &amp;. Для получения дополнительной информации см. эту простую статью.

Еще одно возможное решение (если вы не хотите/не можете убежать) заключается в том, чтобы заключить URL-адрес внутри раздела CDATA следующим образом:

<url>
  <loc><![CDATA[http://www.ezed.in/ezed/courseDemoIntroPage.do?courseId=COU10000000138003530&checkingCourseFrom=preLogin#.U2DcKvmSySo]]></loc>
</url>

Ответ 2

Другой способ, как показано ниже:

Вместо «CDATA» мы могли бы использовать htmlspecialchars PHP собственную функцию для url node. он будет работать с небольшим количеством XML-корма, который им не нужен CDATA в xml-выходе, поэтому это будет полезно для кого-то.

Спасибо

Ответ 3

Сегодня я столкнулся с той же проблемой: если вы создаете ссылки с помощью PHP, вы можете использовать эту функцию:

htmlspecialchars();

Он отформатирует нужную вам строку в HTML-символы, чтобы вы могли вставить ее как <loc>.

XML Validation errors can occur when the structure of an XML document does not match the expectations of the XML schema or DTD. The «EntityRef: expecting ‘;'» error specifically occurs when an entity reference (e.g.  ) is used in the XML document, but it is not properly terminated with a semicolon (;). This can result in the XML parser being unable to properly parse the document.

Method 1: Adding the missing semicolon

To fix the XML validation error «EntityRef: expecting ‘;’ «, you can add the missing semicolon in the XML file. Here’s how to do it:

  1. Open the XML file in a text editor.

  2. Look for the line that has the error. The error message should give you a clue as to where the problem is.

  3. Find the EntityRef that is missing the semicolon. It should look something like this: «&amp».

  4. Add the semicolon at the end of the EntityRef. So it should look like this: «&»

Here’s an example of how to add the missing semicolon in Python:

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()

element = root.find('element')

text = element.text

text = text.replace('&amp', '&amp;')

element.text = text

tree.write('file.xml')

And here’s an example of how to add the missing semicolon in Java:

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class FixXmlError {
  public static void main(String[] args) {
    try {
      // Load the XML file
      File xmlFile = new File("file.xml");
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
      Document doc = dBuilder.parse(xmlFile);

      // Find the Element that has the error
      NodeList nodeList = doc.getElementsByTagName("element");
      Element element = (Element) nodeList.item(0);

      // Get the text of the Element
      String text = element.getTextContent();

      // Add the missing semicolon
      text = text.replace("&amp", "&amp;");

      // Set the new text of the Element
      element.setTextContent(text);

      // Write the updated XML to a file
      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      Transformer transformer = transformerFactory.newTransformer();
      DOMSource source = new DOMSource(doc);
      StreamResult result = new StreamResult(new File("file.xml"));
      transformer.transform(source, result);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Method 2: Escaping the entity reference

To fix the XML validation error «EntityRef: expecting ‘;'», you can escape the entity reference by replacing the «&» character with «&». This will ensure that the XML parser recognizes the character as a literal «&» and not as the start of an entity reference.

Here is an example of how to escape the entity reference in XML using Python’s ElementTree library:

import xml.etree.ElementTree as ET

xml_string = "<root>Some text with an & entity reference</root>"

xml_string = xml_string.replace("&", "&amp;")

root = ET.fromstring(xml_string)

print(root.text)

And here is an example of how to escape the entity reference in XML using Java’s DOM parser:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import java.io.StringReader;

// create XML with unescaped entity reference
String xmlString = "<root>Some text with an & entity reference</root>";

// escape the entity reference
xmlString = xmlString.replace("&", "&amp;");

// parse the XML
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(xmlString));
Document doc = builder.parse(is);

// get the root element
Element root = doc.getDocumentElement();

// get the text
String text = root.getTextContent();

// print the text
System.out.println(text);

In both examples, we start by creating an XML string with an unescaped entity reference. We then escape the entity reference by replacing «&» with «&». Finally, we parse the XML and extract the text content of the root element.

Note that there are other ways to escape entity references in XML, such as using CDATA sections or numeric character references. However, escaping with «&» is a simple and widely accepted solution.

Method 3: Replacing the entity reference with its character equivalent

To fix the XML validation error «EntityRef: expecting’;'», you can replace the entity reference with its character equivalent. Here are the steps to do it:

  1. Identify the entity reference that is causing the error. For example, «&» represents the «&» character.

  2. Replace the entity reference with its character equivalent. For example, replace «&» with «&».

  3. Repeat step 2 for all entity references that are causing the error.

Here is an example code snippet in Python using the replace() method to replace the entity reference «&» with «&»:

xml_string = "<root>&amp; is an entity reference.</root>"
fixed_xml_string = xml_string.replace("&amp;", "&")
print(fixed_xml_string)

Output:

<root>& is an entity reference.</root>

Here is another example code snippet in Java using the replaceAll() method to replace multiple entity references:

String xmlString = "<root>&lt; is less than, &gt; is greater than.</root>";
String fixedXmlString = xmlString.replaceAll("&lt;", "<").replaceAll("&gt;", ">");
System.out.println(fixedXmlString);

Output:

<root>< is less than, > is greater than.</root>

Note that replacing entity references with their character equivalents may not always be the best solution, especially if the XML document is being used in a system that requires the entity references to be preserved. In such cases, it may be necessary to modify the DTD or schema to include the missing entity definitions.

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • 1с управляемые формы сообщить об ошибке
  • 1с установка ошибка применения преобразований
  • 1с установка ошибка data1 cab
  • 1с упп ошибка получения обработки обслуживания
  • 1с унф ошибка не хватает запасов на складе

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: