我正在使用Actionscript的XML类来读取和修改Word OpenXML文档。出于某种原因,在我完成修改XML之后,将其转换回字符串会从文本节点中删除空格。实际上,这并不是真的,因为未修改的XML文档也没有这些空格,但它们仍然显示在word文档中。事实上,如果我对文档内容的所有操作都是使用XML解析器解析它然后将其转换回字符串,那么未触及的XML与通过解析器的XML之间的唯一区别就是xml:
名称空间前缀从space
节点的w:t
属性中删除。
未触及的XML示例:
<w:p w:rsidR="0012761D" w:rsidRPr="004F0FA6" w:rsidRDefault="0012761D" w:rsidP="004F0FA6">
<w:pPr>
<w:rPr>
<w:rFonts w:ascii="Gotham Book" w:hAnsi="Gotham Book"/>
<w:b w:val="0"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="004F0FA6">
<w:rPr>
<w:rFonts w:ascii="Gotham Book" w:hAnsi="Gotham Book"/>
<w:b w:val="0"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t xml:space="preserve">Distance</w:t>
</w:r>
<w:r w:rsidR="004F0FA6">
<w:rPr>
<w:rFonts w:ascii="Gotham Book" w:hAnsi="Gotham Book"/>
<w:b w:val="0"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>at</w:t>
</w:r>
<w:r w:rsidRPr="004F0FA6">
<w:rPr>
<w:rFonts w:ascii="Gotham Book" w:hAnsi="Gotham Book"/>
<w:b w:val="0"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t xml:space="preserve">SL, ISA, MTOW</w:t>
</w:r>
</w:p>
来自通过Actionscript解析器的XML的示例:
<w:p w:rsidR="0012761D" w:rsidRPr="004F0FA6" w:rsidRDefault="0012761D" w:rsidP="004F0FA6">
<w:pPr>
<w:rPr>
<w:rFonts w:ascii="Gotham Book" w:hAnsi="Gotham Book"/>
<w:b w:val="0"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="004F0FA6">
<w:rPr>
<w:rFonts w:ascii="Gotham Book" w:hAnsi="Gotham Book"/>
<w:b w:val="0"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t space="preserve">Distance</w:t>
</w:r>
<w:r w:rsidR="004F0FA6">
<w:rPr>
<w:rFonts w:ascii="Gotham Book" w:hAnsi="Gotham Book"/>
<w:b w:val="0"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>at</w:t>
</w:r>
<w:r w:rsidRPr="004F0FA6">
<w:rPr>
<w:rFonts w:ascii="Gotham Book" w:hAnsi="Gotham Book"/>
<w:b w:val="0"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t space="preserve">SL, ISA, MTOW</w:t>
</w:r>
</w:p>
第一个样本产生“SL,ISA,MTOW的距离”,而第二个样本的文档产生“DistanceatSL,ISA,MTOW”。
正如您所看到的,唯一的区别在于<w:t xml:space="preserve">Distance</w:t>
和<w:t space="preserve">Distance</w:t>
之间。
所以我尝试手动将xml:
前缀添加到空间属性中,但这没有任何效果。
我还试图将XML类的prettyPrinting
属性设置为false
,但它会以某种方式破坏文档。
还有其他东西可以解决那些缺失的空间吗?
感谢。
答案 0 :(得分:1)
我对xmlns:xml
进行了一些研究:
W3C在文件Namespaces in XML 1.1 under section 3 Declaring Namespaces中声明:
命名空间约束:保留的前缀和命名空间名称
根据定义,前缀 xml 绑定到命名空间名称
http://www.w3.org/XML/1998/namespace
。它 MAY ,但不需要声明,并且绝不能未声明或绑定到任何其他命名空间名称。其他前缀绝不能绑定到此命名空间名称,并且 MUST NOT 不能声明为默认命名空间。
我搜索了actionscript XML xmlns:xml并对该主题进行了一些实验, 为了找到答案,Actionscript似乎隐含地了解了该命名空间,但似乎将其视为默认命名空间。因此,当它被打印&#34;打印&#34;相应的属性不再具有命名空间。
您可以做的是使用XML实例上的addNamespace明确地设置命名空间。然后,生成的XML将正确包含所有属性,并包含名称空间声明。
如果您不想要名称空间声明,那么在存储结果之前,您可以通过replace方法从字符串中删除声明。
我tested it using this code(我采用了代码和输出的顺序,以便在此处显示或在其他地方使用时更有意义):
var xml:XML = <data/>;
xml.appendChild(<element xml:attr="what"/>);
trace('without explicit namespace:');
trace(xml);
xml.addNamespace(new Namespace("xml","http://www.w3.org/XML/1998/namespace"));
trace('after adding xml namespace:');
trace(xml);
trace('removing the xml ns from the string of the correct XML');
trace(xml.toXMLString().replace(' xmlns:xml="http://www.w3.org/XML/1998/namespace"',''))
它产生以下输出:
没有明确的命名空间:
<data>
<element attr="what" xmlns="http://www.w3.org/XML/1998/namespace"/>
</data>
添加xml命名空间后:
<data xmlns:xml="http://www.w3.org/XML/1998/namespace">
<element xml:attr="what"/>
</data>
从正确的XML 的
中删除xml ns<data>
<element xml:attr="what"/>
</data>