Regex / Parse XML-файл - PullRequest
       31

Regex / Parse XML-файл

2 голосов
/ 12 июня 2011

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

Позже мне нужно будет проверить текст [type] и заменить его содержимое, если оно соответствует определенным словам.Например, если слово metal находится где-либо внутри тега [type], замените содержимое этого тега только словом metal.

Я знаю, что это большой запрос;Я ценю любую помощь.

Ответы [ 5 ]

2 голосов
/ 12 июня 2011

Другой способ - просто использовать простое преобразование XML → XML (XSLT 1.0 с XPath 1.0), как показано ниже. Его легко адаптировать к вашим требованиям и повторно использовать для других документов.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="root">
        <root>
            <xsl:apply-templates select="GOBJ"/>
        </root>
    </xsl:template>

    <xsl:template match="GOBJ">
        <GOBJ>
            <xsl:copy-of select="item"/>
            <type>
                <xsl:choose>
                    <xsl:when test="contains(type, 'metal')">
                        <xsl:text>metal</xsl:text>
                    </xsl:when>
                    <!-- other xsl:when conditions here -->
                    <xsl:otherwise>
                        <xsl:value-of select="type"/>
                    </xsl:otherwise>
                </xsl:choose>
            </type>
        </GOBJ>
    </xsl:template>
</xsl:stylesheet>

Я знаю, что это не решение на основе регулярных выражений, но имхо лучше использовать нативный XML-ориентированный инструментарий.

0 голосов
/ 23 января 2019

Если вы хотите проанализировать файл журнала XML, чтобы вы могли использовать regex {java}, <[^<]+< .so вы получите <name>DEV</name>. Выведите как name> DEV .

0 голосов
/ 12 июня 2011

Я разработал другой способ решения проблемы;Я создал скрипт jquery, который разделил код xml (я заменил все стрелки влево / вправо на другой символ перед рукой) и вывел запись массива, если у меня не было другого определенного символа.

var name = $('div').text().trim().split(/\[name\](.*?)\[\/name\]/g);
var type = $('div').text().trim().split(/\[type\](.*?)\[\/type\]/g);
for (i = 0; name.length > i; i++) {
        if ((type[i].match(/\[/g))) {
            type[i] = "";
        }
        if (!(name[i].match(/\[/g))) {
            if (type[i].match(/construction/g)) {type[i] = "T_C";}
            if (type[i].match(/material/g)) {type[i] = "T_M";}
            if (type[i].match(/metalwork/g)) {type[i] = "T_W";}
            if (type[i].match(/water/g)) {type[i] = "T_W";}
            if (type[i].match(/oil/g)) {type[i] = "T_O";}
            if (type[i].match(/precious/g)) {type[i] = "T_P";}
            if (type[i].match(/magic/g)) {type[i] = "T_M";}
            $('.Collect').append('<p>a href="../Img/XXX/' + name[i] + '.jpg" class="' + type[i] + '">' + name[i] + '/a></p>');
        } else {
            name[i] = "";
        }

    }

Выходные данные отформатированы таким образом, чтобы я мог просто скопировать и вставить страницу в файл txt / html, и получить его почти так, как я хотел.Мне придется найти какой-нибудь способ заменить XXX на соответствующее имя каталога ...

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

0 голосов
/ 12 июня 2011

Вот решение grep: grep -E '(<item>|<type>)' myfile.xml

0 голосов
/ 12 июня 2011

Предполагая, что файл выложен именно так, как в вашем примере, умножено на столько записей, сколько требуется, и что вы хотите максимально сохранить исходный макет, заменив

(<GOBJ>[^<]+?).+?(<item>.+?<\/type>\n).+?(<\/GOBJ>)

с

$1$2$3

глобально, и регулярное выражение настроено для работы в однострочном режиме, будет делать то, что вам нужно, если элемент <GOBJ> - в верхнем регистре, другие элементы - в нижнем регистре, всегда есть только один экземпляр каждого элемента на запись элемент <item> всегда появляется непосредственно перед элементом <type> в каждой записи.

В JavaScript это будет:

var result = src.replace(
    /(<GOBJ>[^<]+?).+?(<item>.+?<\/type>\n).+?(<\/GOBJ>)/g, 
    '$1$2$3'
);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...