从 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”。
如您所见,唯一的区别在于<w:t xml:space="preserve">Distance</w:t>
和<w:t space="preserve">Distance</w:t>
。
所以我尝试手动将xml:
前缀添加到空间属性,但这没有任何效果。
我还尝试将 XML 类的 prettyPrinting
属性设置为 false
,但它以某种方式损坏了文档。
是否还有其他原因可能导致这些缺失的空格?
谢谢。
【问题讨论】:
您应该提供更多的 XML,尤其是包含命名空间定义的部分。据我所知,您展示的部分不是有效的 XML。 (从 AS3 的角度来看,它最多是一个 XMLList) 您的问题是“xml”前缀的抑制。xml:space='preserve'
表示保留空格,space='preserve'
表示什么都没有,所以不再显示空格。
是的,我也是这么想的。通过查看完整的 XML 结构,我希望获得有关已配置名称空间的更多信息,以便了解为什么要删除此名称空间。
抱歉,我弄乱了示例中的格式(</w:p>
结束标记不可见)。样本构成w:tc
节点中的一个w:p
节点w:tr
节点中的w:tbl
节点中w:body
节点中的w:document
节点中。我确实尝试将 xml:
前缀添加到 space
属性,但没有结果。
整个XML结构非常庞大。
【参考方案1】:
我对@987654324@做了一些研究:
文档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 使用动态文本字段删除闪光按钮上的箭头