2

我正在解析一些 XML(如果重要,则为document.xmlMS-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 解析器吗?

4

0 回答 0