Donguy1976 Ответов: 3

Получить номер строки из XML-файла


Я пишу код на C++ в Visual Studio 2015 и использую стандартные XML-библиотеки, поставляемые с API Windows.

Ниже приведен пример XML-файла, который у меня есть.

<document>
    <schemaVersion>1.0.1</schemaVersion>
    <ID-1>
       <name>Sample XXX</name>
    </ID-1>
    <ID-2>
      <date>2009-03-17</date>
      <ID-2-1>
        <mediaType>myCable</mediaType>
      </ID-2-1>
      <documentType>myOrder</documentType>
    </ID-2>
    <ID-3>
      <documentCode>1</documentCode>
      <ID-3-1>
        <name>kool</name>
        <ID-3-2>
          <id>555</id>
        </ID-3-2>
      </ID-3-1>
    <ID-3>
  </document>


Моя задача-найти номер строки для конкретного тега. Я провел некоторое исследование в интернете и не смог найти способ получить номера линий.

Например, я хочу получить номер строки для тега узел documenttype

Мне не очень повезло сделать это в C++, то есть я не мог найти библиотеку, которая даст мне номера строк. В настоящее время я использую MSXML lib.

Может ли кто-нибудь подсказать мне, можно ли это сделать в C++? Любой пример кода будет очень полезен.

Что я уже пробовал:

В настоящее время я увеличиваю целое число в цикле, где оно проходит через узлы XML. И это целое число будет содержать номер строки для конкретного тега. Это не является правильной логикой и не сработает, если в XML-файле есть разрывы строк.

[no name]

Здесь нет никакой магии.

nv3

Мое лучшее предположение заключается в том, что MSXML не позволит вам найти номер строки тега. Вероятно, вам нужно будет найти другую библиотеку XML или реализовать свой собственный парсер, который отслеживает номера строк.

11917640 Member

Вы можете использовать Microsoft XmlLite SDK: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms752861(v=vs. 85) IXMlReader::GetLineNumber-это функция, которая вам нужна: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms752834%28v%3dvs.85%29 однако XmlLite-это относительно низкоуровневый SDK, и разбор XML-документа не так прост. Вы не можете загрузить весь документ сразу, и вам нужно построить логику синтаксического анализа в программе.

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
я не мог найти библиотеку, которая даст мне номера линий.

Причина в том, что номер строки не имеет смысла. линии и отступы существуют только для того, чтобы помочь чтению людьми.
Технически xml может быть одной строкой. Вот почему никому нет дела до номеров строк.

Если вы действительно хотите использовать номера строк, я боюсь, что вам придется построить свое собственное решение.


Donguy1976

Я понимаю, что XML может быть однострочным. Но в моем случае мы удостоверяемся, что XML-это несколько строк, и цель получения номера строки-сообщить пользователю, есть ли ошибка в одном или нескольких тегах. Так вы говорите, что нет никакого способа сделать это в C++? Кроме написания моей собственной логики синтаксического анализа XML для получения номеров строк?

Patrice T

"Кроме написания моей собственной логики синтаксического анализа XML для получения номеров строк?"
Да, или вам нужно найти библиотеку, которая позволит вам использовать номера строк.
Я не знаю ни одного.

Рейтинг:
0

KarstenK

Даже XML - файл является текстовым файлом, поэтому вы можете искать позицию тега и затем подсчитывать коды CR до позиции вашего тега.

Вот некоторые из них пример кода без МФЦ. Или использовать Найди функционируйте аналогичным образом.


Donguy1976

Это решение будет работать, если существует только один тег определенного типа. Что делать, если существует несколько тегов одного типа? то есть, если мне нужен номер строки для тега <documenttype>, а затем он присутствует в нескольких местах XML-файла.

Рейтинг:
0

Member 14675365

Если вы используете C++ в Visual Studio и вам нужны номера строк для файла с CRs в конце каждой строки, вы, вероятно, можете сделать то же самое, что я делаю с C#. Считайте XML-файл ("myFile") непосредственно в строковый массив "myText". Вместо того чтобы получать номера строк от 1 до 22, Вы получаете массив строк с нулевым индексом 0-21, причем каждая строка является строкой из вашего XML - файла. Таким образом, "documentType" будет найден в myText[10], который соответствует строке 11 вашего XML:



String[] myText = файл.ReadAllLines(myFile);



Именно это я делаю с Visual Studio, используя C# для разработки приложений Windows Forms.


Richard Deeming

С C# есть гораздо более простой вариант - загрузить XDocument с LoadOptions.SetLineInfo, приведите узел к IXmlLineInfo, и прочитать его LineNumber собственность:
c# - получить номер строки для XElement здесь - переполнение стека[^]

Но очевидно, что это не поможет оператору, который использует C++. :)