Я знаю, что это - промежуточный случай, принадлежит ли он действительно stackoverflow или суперпользователю, но поскольку кажется, что существует довольно много 'вопросов' кода редактирования здесь, я отправляю его на ТАК.
У меня есть груда XML-файлов, что кто-то в их бесконечной мудрости решил взорвать к нескольким файлы с помощью тегов, который в результате делает отладку/редактирование их огромным Лавашем. Поэтому я ищу:
Файлы, включенные в верхний уровень, могли бы включать новые файлы и так далее в то, кто знает на том, сколько уровней, таким образом, это должно быть рекурсивно...
Вот образец макета на том, на что похож высокоуровневый файл:
<?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
и все - целая и невредимая легкая рыбачья плоскодонка.
Если у вас установлена libxml2, то xmllint, скорее всего, сделает это за вас. В зависимости от ваших настроек, вам может понадобиться больше параметров, но, например,
xmllint --noent foobar.xml
распечатает ваш файл в stdout с разрешением всех сущностей. Должно быть достаточно просто обернуть вокруг него какой-нибудь бэш-скрипт, чтобы сделать то, что вам нужно.
К сожалению, 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% быстрее в тестах.
Известные счетчики представлений 1990-х годов использовали простые файлы для хранения номера. Если вам нужно только хранить один номер, все достаточно хорошо.
-121--4144629-Для параметра # 3 можно просмотреть pixdom и ознакомьтесь с документацией по pxdom 1.5 A Реализация DOM Python
Параметры конфигурации DOMConfiguration
Результат операции синтаксического анализа зависит от параметров, установленных на Сопоставление LSParser.domConfig. Около по умолчанию, в соответствии с DOM спецификация, все разделы CDATA будут заменять узлами обычного текста и все привязанные ссылки на объекты будут заменено содержимым объекта упоминается. Сюда входят внешние ссылки на объекты и внешние подмножество.
он включает сериализатор для сохранения документа в файл.
Вы ищете что-то вроде этого?
#!/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()