Форматирование xml в linux

Обновлено: 04.07.2024

Я попытался отформатировать нижеприведенный XML с помощью xmllint --format xmlfilename , но безуспешно, так как файл не имеет корневого узла.

В качестве теста я поставил корневой узел, и файл XML был успешно отформатирован.

Как я могу отформатировать этот файл без корневого узла?

2 ответа

У меня есть 2 xml файлов и одна функция для их разбора. Функция должна знать, как анализировать их в соответствии с именем корневого узла документа xml. Как я могу получить корневое имя?

Я новичок в XML и до сих пор сумел получить корневой узел XML, используя это в php. function xmlRootNode($xmlfile) < $xml = simplexml_load_string(file_get_contents($xmlfile)); $xml = $xml->getName(); echo $xml; >И теперь я хочу использовать этот корневой узел, чтобы узнать имя его дочернего.

Вы можете включить это содержимое в файл "wrapper" XML, который включает его содержимое, используя ссылку на внешнюю сущность .

В приведенном ниже примере предполагается, что ваш контент-это файл fragment.xml , а "wrapper" XML находится в одном каталоге.

Затем проанализируйте/преобразуйте файл "wrapper" XML, чтобы проанализировать/отформатировать содержимое.

Похожие вопросы:

Привет, я должен разобрать файл XML в android, но в Xml нет корневого элемента. Вот так ниже: <?xml version=1.0 encoding=UTF-8?> <iii> <kkk>test</kkk>.

Как восстановить атрибут id корневого узла a xml с помощью XSL?

Я ищу простой способ сгенерировать образец файла XML из файла XSD, который не содержит ни одного корневого узла.

У меня есть 2 xml файлов и одна функция для их разбора. Функция должна знать, как анализировать их в соответствии с именем корневого узла документа xml. Как я могу получить корневое имя?

Я новичок в XML и до сих пор сумел получить корневой узел XML, используя это в php. function xmlRootNode($xmlfile)< $xml = simplexml_load_string(file_get_contents($xmlfile)); $xml =.

У меня есть простой документ xml, и я пытаюсь получить описание корневого узла с помощью org.w3c.dom.Document <?xml version=1.0 encoding=ISO-8859-1?><students.

Точно такой же вопрос был задан и здесь: JAX-RS-JSON без корневого узла , но решение не работает для меня, потому что мой сервер не имеет никаких других интерфейсов, кроме REST, поэтому файл.

Мне нужно разобрать огромный файл с Perl. (поэтому я буду использовать потоковый парсер ..) Файл содержит несколько документов (объектов) XML, но не имеет корневого узла. Это приводит к тому, что.

Можно ли получить xml строковую форму DomDocument или SimpleXml без корневого узла? DomDocument->saveXml() возвращает это: <root> <item>text</item> <item>text</item>.

У меня есть документ xml, который не имеет корневого узла. Это выглядит так: <?xml version=1.0?> <Line> <City>Paris</City> <Country>France</Country> </Line>.


Согласитесь, приятно и полезно, когда в проекте исходный код выглядит красиво и единообразно. Это облегчает его понимание и поддержку. Покажем и расскажем, как реализовать форматирование исходного кода при помощи clang-format, git и sh.

Проблемы с форматированием и как их решить

В большинстве проектов существуют определенные правила оформления кода. Как сделать так, чтобы все участники их выполняли? На помощь приходят специальные программы — clang-format, astyle, uncrustify, — но у них есть свои недостатки.

Главная проблема форматеров состоит в том, что они меняют файлы целиком, а не только изменённые строки. Расскажем, как мы с этим справились, используя ClangFormat в рамках одного из проектов по разработке встроенного ПО для электроники, где С++ был основным языком. В команде работало несколько человек, поэтому для нас было важно обеспечить единый стиль кода. Наше решение может подойти не только программистам С++, но и тем, кто пишет код на C, Objective-C, JavaScript, Java, Protobuf.

Для форматирования мы использовали clang-format-diff-6.0. На старте запустили команду

git diff -U0 --no-color | clang-format-diff-6.0 -i -p1, но с ней возникли проблемы:

Решение

В результате получился следующий sh-скрипт, запускаемый как pre-commit — хук для git:


Что делает скрипт:
GIT_DIFF=" git diff -U0 --no-color " — изменения в коде, которые подадут на вход clang-format-diff-6.0.

  • -U0: обычно git diff выводит так называемый «контекст»: несколько неизменёных строк кода вокруг тех, что были изменены. Но clang-format-diff-6.0 форматирует их тоже! Поэтому контекст в данном случае не нужен.
  • -p0: по умолчанию git apply пропускает первый компонент в пути к файлу, это несовместимо с форматом, который выдаёт clang-format-diff-6.0. Здесь отключено такое пропускание.

echo "$" | eval $ --cached форматирует исходный код в индексе (после git add). К сожалению, нет такого хука, который срабатывал бы перед добавлением файлов в индекс. Поэтому форматирование разделено на две части: форматируется то, что в индексе и отдельно то, что не добавлено в индекс.

eval $ | eval $ | eval $ — форматирование кода не в индексе (запускается, только когда что-то было отформатировано в индексе). Форматирует вообще все текущие изменения в проекте (под контролем версий), а не только из предыдущего шага. Это спорное, на первый взгляд, решение. Но оно оказалось удобным, т.к. рано или поздно другие изменения надо форматировать тоже. Можно заменить "| eval $" опцией -i, которая заставит $ менять файлы самостоятельно.

Демонстрация работы

Недостатки и проблемы

git diff --staged (который здесь $ --staged) выдаёт diff только тех файлов, что были добавлены в индекс. А clang-format-diff-6.0 обращается к полным версиям файлов за пределами него. Поэтому, если изменить какой-то файл, сделать git add, а потом изменить тот же файл, то clang-format-diff-6.0 будет генерировать патч для форматирования кода (в индексе) на основе отличающегося файла. Таким образом, файл после git add и до коммита лучше не редактировать.

Вот пример такой ошибки:

  1. Добавить в file.cpp, " Second case " лишний std::endl. (std::cout << " Second case " << std::endl << std::endl;) и несколько табов лишнего отступа перед строкой.
  2. git add file.cpp
  3. Очистить строку (в этом же файле) с " First case " так, что бы на её месте остался(!) только перенос строки.
  4. git commit -m " Formatter error on commit ".

Самое серьёзное ограничение — необходимость иметь в конце каждого файла перевод строки. Это старая особенность git, поэтому большинство редакторов кода, поддерживают автоматическую вставку такого перевода в конец файла. Без этого скрипт будет падать при коммите нового файла, но это не принесет никакого вреда.

Очень редко clang-format-diff-6.0 форматирует код неадекватно. В этом случае можно добавить какие-нибудь бесполезные элементы в код, типа точки с запятой. Либо, окружить проблемный код комментариями, /* clang-format off */ и /* clang-format on */.

Также clang-format-diff-6.0 может выдавать неадекватный патч. Это заканчивается тем, что git apply не принимает его, и код части коммита остается неотфоматированным. Причина — внутри clang-format-diff. Нет времени разбираться во всех ошибках программы. В этом случае можно посмотреть на патч форматирования с помощью команды git diff -U0 --no-color HEAD^ | clang-format-diff-6.0 -p1 -v -sort-includes -style=Chromium -iregex '.*\.(cxx|cpp|hpp|h)$'. Самым простым решением будет добавление опции -i к предыдущей команде. В этом случае утилита не будет выдавать патч, а отформатирует код. Если не помогло, можно попробовать форматирование для отдельных файлов целиком clang-format-6.0 -i -sort-includes -style=Chromium file.cpp. Далее git add file.cpp и git commit --amend.

Есть предположение, что чем ближе ваш конфиг .clang-format к одному из пресетов, тем меньше таких ошибок вы увидите. (Здесь его заменяет опция -style=Chromium).

Отладка


Если хотите посмотреть, какие изменения сделает скрипт на ваших текущих правках (не в индексе), используйте git diff -U0 --no-color | clang-format-diff-6.0 -p1 -v -sort-includes -style=Chromium -iregex '.*\.(cxx|cpp|hpp|h)$' Также можно проверить, как будет работать скрипт на последних коммитах, например, на тридцати: git filter-branch -f --tree-filter " $/.git/hooks/pre-commit " --prune-empty HEAD

30..HEAD . Данная команда должна была форматировать предыдущие коммиты, но по факту меняет только их id. Поэтому стоит проводить такие эксперименты в отдельной копии проекта! После она станет непригодной для работы.

Заключение

Субъективно, от такого решения гораздо больше пользы чем вреда. Но надо тестировать поведение clang-format-diff разных версий на коде вашего проекта, с конфигом для вашего стиля кода.

К сожалению, такой же git-hook для Windows мы не делали. Предлагайте в комментариях, как это сделать там. А если нужна статья для быстрого старта с clang-format, советуем посмотреть описание ClangFormat.

XML or extensible markup language is popular data structure used to express data in a exchangeable format. It is mostly used for configuration and data exchange between web services. While inspecting some XML in Linux via command line we generally need to print in a more readable and structured way. In this tutorial we will look how to pretty print XML in Linux command line.

xmllint is a tool provided by libxml2-utils package. It can be installed like below for deb based distributions like Debian, Ubuntu, Mint and Kali

Or rpm based distributions like Fedora, CentOS, RedHat

We can format xml file named data.xml like below by providing --format option.

Xmllint

Xmllint

xml_pp is provided by xml-twig-tools and can be installed like below.

We can use xml_pp wiothout providing any option just providing the XML file name like below.

xmlstarlet is single tool which can format XML in different ways. We can install xmlstarlet for deb based distributions like below.

Or rpm based distribuıtions

We will use format and --indent-tab for the command and tab indentation.

Xmlstarlet

Xmlstarlet

tidy tool is developed to read and write cleaned-up markup for HTMLiXHTML and XML files. We can install for Ubuntu, Debian, Mint and Kali like below.

OR for Fedora, CentOS, RedHat

We will use -xml to specify the file data format and -i for indentation.

Tidy

Tidy

As we can see tidy provides error or warning information before printing formatted xml.

Yes python have a lot of libraries and one of them is xml library which can be used to create or parse XML data. We can use xml.dom.minidom module parseString() functions like below. We will redirect data of the XML file named data.xml .

Python XML Library

Python XML Library

Читайте также: