簡體   English   中英

NSDocument XML 讀取問題

[英]NSDocument XML read Issue

我正在開發基於 NSDocument 的 Mac 應用程序。 哪個導入 .xml 文件。 它適用於某些 xml 文件,但很少有問題。

問題是 read() 在我們導入文件時正在修改數據,我需要保持原始數據不變。 我需要做些什么來確保我在 read() 中獲得原始 xml 數據?

我正在使用下面的函數來讀取文件

override func read(from data: Data, ofType typeName: String) throws {
    var error:NSError? = nil
    var xmlDocument1:XMLDocument? = XMLDocument()
    do{
        xmlDocument1 = try XMLDocument(data: data, options: XMLNode.Options(rawValue: XMLNode.Options.RawValue(Int(XMLNode.Options.nodePreserveWhitespace.rawValue))))
    }catch let err as NSError{
        error = err
    }
    if error != nil {
        throw error!
    }
}

我解析 xmlDocument1 以讀取並獲取所有 xml 信息。

問題:這樣做 swift 正在修改文檔,如下所述。

示例 1:

原來的:

<iws:attr-option name="1 - Poor" /> 
<iws:attr-option name="2 - Needs Improvement" />

從 Read() 獲取數據,注意自動添加的結束標簽

<iws:attr-option name="1 - Poor"></iws:attr-option>
<iws:attr-option name="2 - Needs Improvement"></iws:attr-option>

示例 2:

原來的:

<source>
    <ph id="12" x="&lt;/span>">{12}</ph>
</source>

從 Read() 獲取數據,注意 ">" 符號被替換為 "& gt;"

<source>
    <ph id="12" x="&lt;/span&gt;">{12}</ph>
</source>

示例 3:

我無法在此處粘貼代碼,因為此處甚至沒有顯示特殊字符,因此請添加圖像。 左邊是原始的,右邊是我在 read() 中得到的,缺少特殊字符。

在此處輸入圖像描述

代碼 Sameple :(我不確定我們是否可以直接在此處發布代碼) https://drive.google.com/drive/folders/1WWGE7fFJPKvs5KU5f_PlwWtoqCVxTcS0?usp=sharing

  1. 在驅動器上方,我們有示例 xml 文件和代碼。
  2. “DevelopingADocumentBasedApp”是代碼,只要打開“DocumentBasedApp.xcodeproj”,運行即可。 3 .一旦運行,點擊菜單->文件->打開並打開提供的xml文件。
  3. 在 content.swift 中,在“print(xmlDocument!)”處保留一個斷點
  4. 這里我們可以看到文檔被NSDocument修改了,和原來的不一樣

編輯:

@matt 感謝您讓我了解真正的問題,最初我認為我對 NSDocument 的 read() 有問題。 但問題是 XMLDocument() 沒有返回准確的數據。 我需要為此找到解決方案。


閱讀不會改變你的文檔。

您使用XMLDocument(data:...)創建一個 xml 文檔。 您正在請求基於您的原始文檔的新的有效 XML 文檔,而這正是您得到的。 生成的結構不是一個大字符串,就像您的原始數據一樣; 它是反映 XML結構的精細節點樹 該節點樹與原始描述的結構相同。 該事實不會以任何方式影響您解析文檔的能力; 確實,這就是您能夠解析文檔的原因。 如果您認為它確實導致無法解析文檔,那么您的解析代碼是錯誤的(但您沒有顯示,所以不能再多說了)。

另請注意,您對 XML 文檔中“內容”的證據是間接的; XML 文檔是一個節點樹,但您顯示的字符串是二次渲染字符串的輸出。 該渲染表示是任意且可延展的; 它遵守自己的格式規則。 (同樣,您沒有展示任何有關如何獲得該渲染的信息。也許我們正在談論您的print聲明?)

關鍵是,您似乎對傳遞XMLDocument 然后它返回將如何“往返”原始字符串以使輸出看起來與原始字符串一樣的方式有某種期望。 這種預期是不正確的。 這不是 XMLDocument 所做的。

並且僅僅將原始data讀入 XMLDocument 並不會改變data ,我可以向你保證。

所以不要擔心,要快樂; 就您的 XML 的有效性而言,一切都很好,並且您開始使用的數據沒有以任何方式改變。


這是一個演示:

let xmlstring = """
<testing>
<fun whatever="thingy" />
</testing>
"""
print(xmlstring)
let xmldata = xmlstring.data(using: .utf8)!
let xml = try? XMLDocument(data: xmldata, options: [])
print("=======")
print(xml!)

輸出是:

<testing>
<fun whatever="thingy" />
</testing>
=======
<?xml version="1.0"?><testing><fun whatever="thingy"></fun></testing>

如您所見, print的輸出與輸入字符串不同。 但它原始字符串的有效 XML 表示,這才是最重要的。 我向您保證,我開始使用的原始xmlstringxmldata完全沒有受到影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM