我正在使用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"
如何解决这个问题?如果可以,请帮助我。
答案 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();
}