- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 xml 文件,内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="array_ngontay_kq">
<item>Bạn là người đáng tin cậy.</item>
<item>Bạn là người có óc xét đoán. </item>
</string-array>
</resources>
我用了HTMLReader获取此字符串数组,但我的输出如下所示:
Bạn là ngÆ°á»i Äáng tin cáºy.
Bạn là ngÆ°á»i có óc xét Äoán.
这是我的代码:
let fileURL = Bundle.main.url(forResource: "BoiTay", withExtension: "xml")
let xmlData = try! Data(contentsOf: fileURL!)
let topic = "array_ngontay_kq"
let document = HTMLDocument(data: xmlData, contentTypeHeader: "text/xml")
for item in document.nodes(matchingSelector: "string-array[name='\(topic)'] item") {
print(item.textContent)
}
有没有办法解决这个问题,或者任何其他解决方案都可以在不使用 HTMLReader 的情况下解决这个问题。抱歉,我是 XMLParse 的新手,我在 Swift 中找不到关于此类 xml 文件的任何答案或教程。
最佳答案
首先,您最好检查一下您的BoiTay.xml
是否真的是UTF-8。我不熟悉越南语编码,但一些工具可能会生成使用 UTF-8 以外的其他编码的 XML,即使 xml header 声明 encoding="utf-8"
。
结果似乎是编码问题,而不是库或代码的错误。
请显示您的 xmlData
的十六进制转储,包括第一个 item
元素。
print(xmlData as NSData)
也许前 256 个字节就足够了。
顺便说一句,使用XMLParser
并不难。 (虽然这不是 super 容易。)
这是一个您可以在 Playground 中测试的示例。
import Foundation
class ResoucesParsingDelegate: NSObject, XMLParserDelegate {
//Property to keey all `string-array`s by name
var stringArrays: [String: [String]] = [:]
var nameParsing: String? = nil
var stringArrayParsing: [String]? = nil
var currentText: String? = nil
func parserDidStartDocument(_ parser: XMLParser) {
print(#function)
}
func parserDidEndDocument(_ parser: XMLParser) {
print(#function)
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print(#function, parseError)
}
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
switch elementName {
case "string-array":
guard let name = attributeDict["name"] else {
print("`string-array` element needs `name` attribute")
return
}
//When you find `<string-array name="...">`, prepare a string array to keep items with its name
nameParsing = name
stringArrayParsing = []
case "item":
if stringArrayParsing == nil {
print("invalid `item` element")
return
}
//When you find `<item>`, prepare a string to keep the content text of the element
currentText = ""
//Prodess other elements
//...
default:
print("Unknown element `\(elementName)`, ignored")
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
switch elementName {
case "string-array":
if stringArrayParsing == nil || nameParsing == nil {
print("invalid end tag `string-array`")
return
}
//When you find `</string-array>`, add the current string array to `stringArrays` with its name
stringArrays[nameParsing!] = stringArrayParsing!
//Clear string array for next use
stringArrayParsing = nil
case "item":
if stringArrayParsing == nil || currentText == nil {
print("invalid end tag `item`")
return
}
//When you find `</item>` add the content text to `stringArrayParsing`
stringArrayParsing!.append(currentText!)
//Clear content text for next use
currentText = nil
//Prodess other elements
//...
default:
print("Unknown element `\(elementName)`, ignored")
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
if currentText == nil {
//Silently igonore characters while content string is not ready
return
}
currentText! += string
}
}
let xmlText = """
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="array_ngontay_kq">
<item>Bạn là người đáng tin cậy.</item>
<item>Bạn là người có óc xét đoán. </item>
</string-array>
</resources>
"""
let xmlData = xmlText.data(using: .utf8)!
print(xmlData, xmlData as NSData)
let parser = XMLParser(data: xmlData)
let resoucesParsingDelegate = ResoucesParsingDelegate()
parser.delegate = resoucesParsingDelegate
parser.parse()
print(resoucesParsingDelegate.stringArrays)
输出:
246 bytes <3c3f786d 6c207665 7273696f 6e3d2231 2e302220 656e636f 64696e67 3d227574 662d3822 3f3e0a3c 7265736f 75726365 733e0a20 2020203c 73747269 6e672d61 72726179 206e616d 653d2261 72726179 5f6e676f 6e746179 5f6b7122 3e0a2020 20202020 20203c69 74656d3e 42e1baa1 6e206cc3 a0206e67 c6b0e1bb 9d6920c4 91c3a16e 67207469 6e2063e1 baad792e 3c2f6974 656d3e0a 20202020 20202020 3c697465 6d3e42e1 baa16e20 6cc3a020 6e67c6b0 e1bb9d69 2063c3b3 20c3b363 2078c3a9 7420c491 6fc3a16e 2e203c2f 6974656d 3e0a2020 20203c2f 73747269 6e672d61 72726179 3e0a3c2f 7265736f 75726365 733e>
parserDidStartDocument
Unknown element `resources`, ignored
Unknown element `resources`, ignored
parserDidEndDocument
["array_ngontay_kq": ["Bạn là người đáng tin cậy.", "Bạn là người có óc xét đoán. "]]
如果您使用 BoiTay.xml
的内容测试此代码并得到与 HTMLReader
类似的结果,则问题肯定是编码问题。
(如果您的实际 xml 比示例更复杂,您可能需要修改此代码。)
关于arrays - 问题从 Swift 中的 xml 文件解码字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52360224/
我有以下 json: {"results": [{"columns":["room_id","player_name","player_ip"], "types":["integer","text
我在 go 中获取格式不一致的 JSON 文件。例如,我可以有以下内容: {"email": "\"blah.blah@blah.com\""} {"email": "robert@gmail.com
JavaScript中有JSON编码/解码base64编码/解码函数吗? 最佳答案 是的,btoa() 和 atob() 在某些浏览器中可以工作: var enc = btoa("this is so
我在其中一个项目中使用了 Encog,但在解码 One-Of Class 时卡住了。该字段的规范化操作之一是 NormalizationAction.OneOf,它具有三个输出。当我评估时,我想解码预
在我的 previous question关于使用 serialize() 创建对象的 CSV 我从 jmoy 那里得到了一个很好的答案,他推荐了我的序列化文本的 base64 编码。这正是我要找的。
有些事情让我感到困惑 - 为什么 this image在每个浏览器中显示不同? IE9(和 Windows 照片查看器)中的图像: Firefox(和 Photoshop)中的图像: Chrome(和
是否可以在不知道它的类型( JAXBContext.newInstance(clazz) )的情况下解码一个类,或者什么是测试即将到来的正确方法? 我确实收到了从纯文本中解码的消息 - 字符串 传入的
我正在尝试使用 openSSL 库进行 Base64 解码,然后使用 CMS 来验证签名。 下面的代码总是将缓冲区打印为 NULL。 char signed_data[] = "MIIO"; int
我有一个带有 SEL 类型实例变量的类,它是对选择器的引用。在encodeWithCoder/initWithCoder中,如何编码/解码这种类型的变量? 最佳答案 您可以使用 NSStringFro
var url = 'http://www.googleapis.com/customsearch/v1?q=foo&searchType=image'; window.fetch(url) .t
我想知道Android 2.2、2.3和3,4支持的音频/视频格式列表。我也想知道哪些Android版本支持视频编码和解码。我经历了this link,但是关于编码和解码我并不清楚。 任何人的回答都是
我在其中一个项目中使用 Encog,但在解码 One-Of 类时遇到了困难。该字段的规范化操作之一是 NormalizationAction.OneOf,它具有三个输出。当我评估时,我想解码预测值。如
我正在尝试解码现有的 xml 文件,以便我可以正确处理数据,但 XML 结构看起来很奇怪。下面是 xml 示例以及我创建的对象。 11 266 AA1001 1
对 unicode 字符进行 URL 编码的常用方法是将其拆分为 2 %HH 代码。 (\u4161 => %41%61) 但是,unicode在解码时是如何区分的呢?您如何知道 %41%61 是 \
我正在尝试将 json 字符串解码为 Map。 我知道有很多这样的问题,但我需要非常具体的格式。例如,我有 json 字符串: { "map": { "a": "b",
我有一个查询,我认为需要像这样(解码会更大) SELECT firstName, lastName, decode(mathMrk, 80, 'A', mathMrk) as decodeMat
我知道PHP函数encode()和decode(),它们对我来说工作得很好,但我想在url中传递编码字符串,但encode确实返回特殊字符,如“=”、“”' “等等...... 这显然会破坏我的脚本,
我必须解码 Basic bW9uTG9naW46bW9uTW90RGVQYXNz 形式的 http 请求的授权 header 当我解码它时online ,我得到了正确的结果 monLogin:monM
这个问题已经有答案了: Decode Base64 data in Java (21 个回答) 已关闭 8 年前。 我想知道使用哪个库进行 Base64 编码/解码?我需要此功能足够稳定以供生产使用。
我正在尝试从 Arduino BT 解码 []byte,我的连接完美,问题是当我尝试解码数组时。我得到的只是这个字符�(发送的字节数相同)我认为问题出在解码上。我尝试使用 ASCII 字符集,但仍然存
我是一名优秀的程序员,十分优秀!