Как получить плоский XML так, чтобы внешние объекты были объединены с верхним уровнем

Я знаю, что это - промежуточный случай, принадлежит ли он действительно stackoverflow или суперпользователю, но поскольку кажется, что существует довольно много 'вопросов' кода редактирования здесь, я отправляю его на ТАК.

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

  1. Путь в VIM для открытия их в единственном буфере (предпочтительно так, чтобы изменения были сохранены в корректных внешних файлах объекта), ИЛИ;
  2. Способ развернуть файлы в VIM так, чтобы внешние объекты были считаны и заменены в буфере, ИЛИ;
  3. легкий bash/sed/python способ сделать это на командной строке (или в .vimrc)

Файлы, включенные в верхний уровень, могли бы включать новые файлы и так далее в то, кто знает на том, сколько уровней, таким образом, это должно быть рекурсивно...

Вот образец макета на том, на что похож высокоуровневый файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foobar PUBLIC "foobar:dtd" "foobar.dtd" [

        <!ENTITY foo SYSTEM "foo.xml">

        <!ENTITY bar SYSTEM "bar.xml">
]>
<foo>
        <params>
                &foo;
        </params>
        <bar>
                &bar;
        </bar>
</foo>

Править: Список в порядке предпочтения - если № 1. или 2. решения доступны, щедрость идет для лучшего № 3...

РЕДАКТИРОВАНИЕ 2: Похож на работы ответа @Gaby, но к сожалению только частично, если я не делаю что-то не так - я запишу своего рода инструмент с помощью его ответа и отправлю его здесь для улучшений. Конечно, решение № 2 или № 1 ценилось бы... :)

РЕДАКТИРОВАНИЕ 3: хорошо, лучший non-Emacs - ответ получит щедрость ;)

Заключение: Благодаря @hcayless у меня теперь есть рабочее решение № 2, я добавил:

autocmd BufReadPost,FileReadPost *.xml silent %!xmllint --noent - 2> /dev/null

к моему .vimrc и все - целая и невредимая легкая рыбачья плоскодонка.

6
задан Kimvais 13 January 2010 в 08:24
поделиться

3 ответа

Если у вас установлена libxml2, то xmllint, скорее всего, сделает это за вас. В зависимости от ваших настроек, вам может понадобиться больше параметров, но, например,

xmllint --noent foobar.xml

распечатает ваш файл в stdout с разрешением всех сущностей. Должно быть достаточно просто обернуть вокруг него какой-нибудь бэш-скрипт, чтобы сделать то, что вам нужно.

5
ответ дан 17 December 2019 в 02:29
поделиться

К сожалению, Apple не предоставляет простых способов введения значений в структуру NSDecimal. Само определение структуры можно найти в заголовке NSDecimal.h:

typedef struct {
    signed   int _exponent:8;
    unsigned int _length:4;     // length == 0 && isNegative -> NaN
    unsigned int _isNegative:1;
    unsigned int _isCompact:1;
    unsigned int _reserved:18;
    unsigned short _mantissa[NSDecimalMaxSize];
} NSDecimal;

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

Учитывая это, инициализация NSDecimal из числа с плавающей точки лучше всего выполняется путь вы описываете. Однако помните, что при любом использовании значения с плавающей точки вы теряете точность, полученную при использовании NSDecimal, и будете подвергаться ошибкам с плавающей точки.

Я всегда работаю только с NSDecimals в моих высокоточных расчетах, и беру и экспортирую NSStrings для обмена этими значениями с внешним миром. Чтобы создать NSDecimal на основе NSString, можно использовать подход, который мы используем в основной структуре графика :

NSDecimal CPDecimalFromString(NSString *stringRepresentation)
{
    NSDecimal result;
    NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation];
    [theScanner scanDecimal:&result];
    [theScanner release];

    return result;
}

Использование NSScanner вместо NSDecimalNumber -initWireString: locale: примерно на 90% быстрее в тестах.

-121--1667194-

Известные счетчики представлений 1990-х годов использовали простые файлы для хранения номера. Если вам нужно только хранить один номер, все достаточно хорошо.

-121--4144629-

Для параметра # 3 можно просмотреть pixdom и ознакомьтесь с документацией по pxdom 1.5 A Реализация DOM Python

Параметры конфигурации DOMConfiguration

Результат операции синтаксического анализа зависит от параметров, установленных на Сопоставление LSParser.domConfig. Около по умолчанию, в соответствии с DOM спецификация, все разделы CDATA будут заменять узлами обычного текста и все привязанные ссылки на объекты будут заменено содержимым объекта упоминается. Сюда входят внешние ссылки на объекты и внешние подмножество.

он включает сериализатор для сохранения документа в файл.

1
ответ дан 17 December 2019 в 02:29
поделиться

Вы ищете что-то вроде этого?

#!/opt/local/bin/python
import sys
if len(sys.argv) < 2:
    print "some files needed."
    sys.exit()

final = """
<?xml version="1.0" encoding="ISO-8859-1"?>
<nodes>
"""
for a in sys.argv[1:]:
    ca = a.replace(".xml","")
    final += "<" + ca + ">\n"
    infile = open(a)
    final += infile.read()
    final += "</" + ca + ">\n"  

final += "</nodes>\n"

outfile = open("final.xml", "w")
outfile.write(final)
outfile.close()
0
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

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