Отсутствует информация о пространстве имен в XML-файле с использованием EXIficient
Я использую EXIficient для преобразования данных XML в EXI и обратно в XML. Здесь я использую их класс EXIficientDemo. Образец кода:
EXIficientDemo sample = new EXIficientDemo();
sample.parseAndProofFileLocations("FilePath");
sample.codeSchemaLess();
Сначала он преобразовал XML-файл в EXI, а затем обратно в XML, когда он генерирует XML из ранее созданного файла EXI, он теряет некоторую информацию о пространстве имен.
Фактический XML-файл:
<?xml version="1.0" encoding="utf-8"?>
<tt xml:lang="ja" xmlns="http://www.w3.org/ns/ttml"
xmlns:tts="http://www.w3.org/ns/ttml#styling"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<body>
<div>
<p xml:id="s1">
<span tts:origin="somethings">somethings</span>
</p>
</div>
</body>
Сгенерированный файл XML по EXIficient
<?xml version="1.0" encoding="UTF-8"?>
<ns3:tt xmlns:ns3="http://www.w3.org/ns/ttml"
xml:lang="ja"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns3:body><ns3:div>
<ns3:p xml:id="s1">
<ns3:span xmlns:ns4="http://www.w3.org/ns/ttml#styling"
ns4:origin="somethings">somethings</ns3:span>
</ns3:p>
</ns3:div></ns3:body>
В сгенерированном XML-файле он отсутствует xmlns:tts="http://www.w3.org/ns/ttml#styling"
Как исправить эту проблему? Если можете, пожалуйста, помогите мне.
2 ответа
EXIficient может подавлять неиспользуемые пространства имен. Ваш пример не показывает никакого использования ttm
Пространство имен.
Как видите, он не сохранил префикс пространства имен для ttml
либо пространство имен (изменено на ns3
). Сгенерированный XML совершенно действителен, если ttml#metadata
пространство имен не используется.
Обновить
С обновленным вопросом, где пространство имен ttml#styling
используется origin
атрибут span
элемент, пространство имен сохраняется в перестроенном XML, но оно было перемещено в span
элемент.
Это все еще очень действительный документ XML.
Объявления пространства имен (xmlns
) может появляться в любом месте XML-документа и применяется к элементу, к которому он относится, и ко всем подэлементам (если не переопределено, что очень необычно).
Одно и то же пространство имен может быть объявлено много раз для разных элементов. Для простоты и / или оптимизации обычно объявляют все пространства имен заранее, в корневом элементе, используя разные префиксы, но это не требуется.
Я прочитал этот вопрос случайно и, к сожалению, довольно поздно. На всякий случай люди все еще борются с этим и задаются вопросом, что они могут сделать.
Как было отмечено, EXIficient ведет себя очень хорошо в отношении обработки пространства имен.
Сказав это, спецификация EXI позволяет сохранить префиксы и пространства имен (см. Параметры сохранения).
В EXIficient можно установить эти параметры соответственно, например,
EXIFactory.getFidelityOptions().setFidelity(FidelityOptions.FEATURE_PREFIX, true);