[英]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="</span>">{12}</ph>
</source>
從 Read() 獲取數據,注意 ">" 符號被替換為 "& gt;"
<source>
<ph id="12" x="</span>">{12}</ph>
</source>
示例 3:
我無法在此處粘貼代碼,因為此處甚至沒有顯示特殊字符,因此請添加圖像。 左邊是原始的,右邊是我在 read() 中得到的,缺少特殊字符。
代碼 Sameple :(我不確定我們是否可以直接在此處發布代碼) https://drive.google.com/drive/folders/1WWGE7fFJPKvs5KU5f_PlwWtoqCVxTcS0?usp=sharing
編輯:
@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 表示,這才是最重要的。 我向您保證,我開始使用的原始xmlstring
和xmldata
完全沒有受到影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.