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

Posted

技术标签:

【中文标题】从 Actionscript 中的文本中删除 OpenXML 空格【英文标题】:OpenXML whitespace removed from text in Actionscript 【发布时间】:2015-11-15 20:54:30 【问题描述】:

我正在使用 Actionscript 的 XML 类来读取和修改 Word OpenXML 文档。出于某种原因,在我修改完 XML 之后,将其转换回字符串会从文本节点中删除空格。实际上,这不是真的,因为未修改的 XML 文档也没有这些空格,但它们仍然出现在 word 文档中。事实上,如果我对文档内容所做的只是使用 XML 解析器对其进行解析,然后将其转换回字符串,那么未修改的 XML 与通过解析器的 XML 之间的唯一区别是 xml: 命名空间前缀从w:t 节点的space 属性中删除。

未改动的 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”。

如您所见,唯一的区别在于&lt;w:t xml:space="preserve"&gt;Distance&lt;/w:t&gt;&lt;w:t space="preserve"&gt;Distance&lt;/w:t&gt;。 所以我尝试手动将xml:前缀添加到空间属性,但这没有任何效果。

我还尝试将 XML 类的 prettyPrinting 属性设置为 false,但它以某种方式损坏了文档。

是否还有其他原因可能导致这些缺失的空格?

谢谢。

【问题讨论】:

您应该提供更多的 XML,尤其是包含命名空间定义的部分。据我所知,您展示的部分不是有效的 XML。 (从 AS3 的角度来看,它最多是一个 XMLList) 您的问题是“xml”前缀的抑制。 xml:space='preserve'表示保留空格,space='preserve'表示什么都没有,所以不再显示空格。 是的,我也是这么想的。通过查看完整的 XML 结构,我希望获得有关已配置名称空间的更多信息,以便了解为什么要删除此名称空间。 抱歉,我弄乱了示例中的格式(&lt;/w:p&gt; 结束标记不可见)。样本构成w:tc 节点中的一个w:p 节点w:tr 节点中的w:tbl 节点中w:body 节点中的w:document 节点中。我确实尝试将 xml: 前缀添加到 space 属性,但没有结果。 整个XML结构非常庞大。 【参考方案1】:

我对@9​​87654324@做了一些研究:

文档Namespaces in XML 1.1 under section 3 Declaring Namespaces中的W3C声明:

命名空间约束:保留前缀和命名空间名称

前缀 xml 根据定义绑定到命名空间名称 http://www.w3.org/XML/1998/namespace。它可以,但不需要,被声明,并且不得未声明或绑定到任何其他命名空间名称。其他前缀不得绑定到此命名空间名称,并且不得声明为默认命名空间。

我搜索了actionscript XML xmlns:xml并对该主题进行了一些实验, 为了找出答案,Actionscript 似乎隐含地知道该命名空间,但似乎将其假定为默认命名空间。所以当它被“打印”出来时,相应的属性就不再有命名空间了。

您可以做的是使用 XML 实例上的 addNamespace 正确地明确设置命名空间。然后,生成的 XML 将正确包含所有属性,并将包含命名空间声明。

如果您不想要命名空间声明,那么在存储结果之前,您可以通过替换方法从字符串中删除声明。

我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>

【讨论】:

以上是关于从 Actionscript 中的文本中删除 OpenXML 空格的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Actionscript 3.0 中的数组 B 中的数组 A 中删除元素?

Flex / Actionscript 中的文本动画库? [关闭]

ActionScript 3 删除ascii文本格式

ActionScript 3 使用动态文本字段删除闪光按钮上的箭头

ActionScript 3 查找和更改变量或文本字段中的文本

ActionScript 3 限制文本字段中的行