使用EXIficient在XML文件中缺少NameSpace信息

时间:2015-09-06 07:42:45

标签: java xml exi exificient

我正在使用EXIficient将XML数据转换为EXI并返回XML。在这里,我使用他们的EXIficientDemo class。示例代码:

EXIficientDemo sample = new EXIficientDemo();
sample.parseAndProofFileLocations("FilePath");
sample.codeSchemaLess();

首先,它将xml文件转换为EXI,然后再转换回XML,当它从以前生成的EXI文件生成XML时,它会丢失一些关于命名空间的信息。

实际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>

EXIficient生成的XML文件

<?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 个答案:

答案 0 :(得分:0)

EXIficient可能会抑制未使用的命名空间。您的示例未显示ttm命名空间的任何用法。

如您所见,它没有保留ttml命名空间的名称空间前缀(更改为ns3)。如果ttml#metadata名称空间未使用,则生成的XML完全有效。

<强>更新

使用更新的问题,ttml#styling元素的origin属性使用名称空间span,名称空间将保留在重建的XML中,但它已被移动到span元素。

这仍然是一个非常有效的XML文档。

命名空间声明(xmlns)可以出现在XML文档的任何位置,并应用于它出现的元素和所有子元素(除非被覆盖,这是非常不寻常的)。

可以在不同的元素上多次声明相同的命名空间。为简单起见和/或优化,通常使用不同的前缀在根元素上预先声明所有名称空间,但不需要这样做。

答案 1 :(得分:0)

我偶然读到了这个问题而且很遗憾。 以防人们仍在努力解决这个问题并且想知道他们能做些什么。

正如所指出的那样,EXIficient在命名空间处理方面表现得很好。

话虽如此,EXI规范允许保留前缀和名称空间(参见there's a difference between text() nodes and string values)。

在EXIficient中可以相应地设置这些选项, 例如,

  public static void MergePDFs(string outPutFilePath, params string[] filesPath)
        {
            //Define a new output document and its size, type
            Document document = new Document(PageSize.A4);

            PdfCopy copyProvider = new PdfCopy(document, new    System.IO.FileStream(outPutFilePath, System.IO.FileMode.Create));

            document.Open();

            List<PdfReader> readerList = new List<PdfReader>();
            foreach (string filePath in filesPath)
            {

                PdfReader pdfReader = new PdfReader(filePath);

                copyProvider.AddDocument(pdfReader);

                pdfReader.Close();
            }

            document.Close();
        }