从Actionscript中的文本中删除了OpenXML空格

时间:2015-08-21 19:54:56

标签: xml actionscript openxml

我正在使用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,但它会以某种方式破坏文档。

还有其他东西可以解决那些缺失的空间吗?

感谢。

1 个答案:

答案 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>