在函数内更改 XML 文件的字符集

问题描述 投票:0回答:1

我有一个外部 XML 文件和一个 XSD 文件。 要处理这些文件,我必须修改它们。 (字符集、命名空间等...) 这时问题就出现了。

class XMLDataModifier(pathToXsd: String) {
// Pattern for XML
private val xsiPatternXML = Regex("schemaLocation=\".*\"")
private val noNamespacelocation = "noNamespaceSchemaLocation=\"${pathToXsd}\""

// Pattern for XSD
private val targetNamespacePatternXSD = Regex("targetNamespace=\".*\"")

// Pattern for XML and XSD
private val encoding = Regex("encoding=\".*\"")
private val xmlnsPattern = Regex("xmlns=\".*\"")

fun modifyFile(file: XmlFile): XmlFile {
    val utf8 = Charsets.UTF_8

    val fileInputAsBytes = file.readBytes()
    var fileInput = String(fileInputAsBytes, utf8)

    println("### inside modifier - FirstCheck ###")
    println(fileInput)
    fileInput = fileInput.replace(encoding, "encoding=\"UTF-8\"")
    fileInput = fileInput.replace(xsiPatternXML, noNamespacelocation)
    fileInput = fileInput.replace(xmlnsPattern, "")

    println("### inside modifier - SecondCheck ###")
    println(fileInput)
    return XmlFile(fileInput)
}

如果我尝试我的功能,就会进行替换。 但打印语句显示一个不可读的字符串。 我认为问题存在是因为字符集没有改变。

Xml 文件(test.xml):

<?xml version="1.0" encoding="ISO-8859-15"?>
<BeherbergungsVerzeichnis
        xmlns="http://xml.inek.org/schema/Standortverzeichnis"
        xsi:schemaLocation="http://xml.inek.org/schema/Standortverzeichnis"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
    <Id>11</Id>
    <Vorname>Günther</Vorname>
    <Nachname>Hartmannsgruber</Nachname>
</Beherbergungsverzeichnis>

运行函数后的输出

### inside modifier FirstCheck ###
<?xml version="1.0" encoding="ISO-8859-15"?>
<BeherbergungsVerzeichnis
        xmlns="http://xml.inek.org/schema/Standortverzeichnis"
        xsi:schemaLocation="http://xml.inek.org/schema/Standortverzeichnis"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
    <Id>11</Id>
    <Vorname>G�nther</Vorname>
    <Nachname>Hartmannsgruber</Nachname>
</Beherbergungsverzeichnis>

### inside modifier SecondCheck ###
<?xml version="1.0" encoding="UTF-8"?>
<BeherbergungsVerzeichnis
        
        xsi:noNamespaceSchemaLocation="/home/user/IdeaProjects/StandortKonverterGradle/src/main/resources/data/testxsd.xsd"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
    <Id>11</Id>
    <Vorname>G�nther</Vorname>
    <Nachname>Hartmannsgruber</Nachname>
</Beherbergungsverzeichnis>
Fehler beim Validieren der XML-Datei: /home/benhartmannsgruber/IdeaProjects/StandortKonverterGradle/<?xml version="1.0" encoding="UTF-8"?>

虽然字符集设置为UTF-8,为什么“ü”出现错误的字符? 有没有更好的解决方案来读取和处理不需要保存的文件?

感谢您的帮助!

xml kotlin xsd
1个回答
0
投票

如果您需要在解析 XML 文件之前在词法级别修改它们,那么您的应用程序架构就存在严重错误。一般来说,您应该只使用基于 XML 的工具(例如 XSLT 和 XQuery)来读取和写入 XML 文件。

尝试更改 XML 声明中“encoding”属性的值将会失败,除非您也相应地更改文件内容的实际编码。看来您将其设置为与实际文件编码不匹配的值。

© www.soinside.com 2019 - 2024. All rights reserved.