我正在解析一些 XML(如果重要,则为document.xml
MS-Word 的有效负载),我需要严格正确的字符偏移量。.docx
我正在使用 Cocoa (OS X) 的NSXMLDocument
家族进行树解析。我已经解决了大部分问题,除了解析器将空格字符的运行报告为单个空格。
本文档中文本运行的原子是<w:t/>
. 在某些情况下,有一个单空格运行:
<w:t xml:space="preserve"> </w:t>
NSXMLDocumentTidyXML
直到我在实例化顶级 XML 对象时提供了选项,该空间才被抑制:
let xmlDocument = try? NSXMLDocument(data: fileData, options: NSXMLDocumentTidyXML)
很好,但它并不能解决所有问题。在 XML 内容中考虑这一点:
<w:t>available to be digitized and posted. But while there</w:t>
您可能会注意到句号后面有两个空格。NSXMLElement
表示 的以及包含它的<w:t/>
任何元素都坚持在句点之后只有一个空格,正如theElement.stringValue!
节点的调试表示所报告的那样:
<w:t>available to be digitized and posted. But while there</w:t>
我可以忍受这一点,但我的计数必须与 Pages、Word 和 中的渲染器一致NSAttributedString
,所有这些都保留了这样的空间运行。
我已经尝试<w:t/>
通过强加xml:space="preserve"
所有元素来暴力破解元素:
let spacePreserveAttribute = NSXMLNode.attributeWithName("xml:space", stringValue: "preserve") as! NSXMLNode
// ...
if let tElements = try? graf.nodesForXPath("descendant::w:t") as! [NSXMLElement] {
for t in tElements {
var tAttrs: [NSXMLNode] = t.attributes ?? []
tAttrs.append(
spacePreserveAttribute.copy() as! NSXMLNode
)
t.attributes = tAttrs
}
}
我准备相信这是错误的代码,但无论如何,它对问题没有影响。这个时候恐怕已经太晚了。
如何让 Cocoa XML 树解析器停止将空格运行到一个空格中?当然,这是一个已解决的问题——世界并没有屈服于其空间崩溃。
请问我可以避免使用第三方 XML 解析器吗?