我正在尝试使用以下代码将文件读取到xml:
import scala.xml._
object HebrewToEnglishCityTranslator {
val data = XML.loadFile("cities_hebrew_utf.xml");
for(val entry <- data \\ "city") {
val hebrewName = (entry \\ "hebrew_name").text
val englishName = (entry \\ "english_name").text
println(hebrewName + "=" + englishName) }
Run Code Online (Sandbox Code Playgroud)
但是,我的文件以UTF-8(希伯来语字符)编码,而XML编码则是 val encoding = "ISO-8859-1"
我该怎么办?
在我的环境中,我使用Java将结果集序列化为XML.它基本上是这样的:
//foreach column of each row
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = rs.getString(i);
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");
Run Code Online (Sandbox Code Playgroud)
在Firefox中,XML看起来像这样:
<row num="69004">
<column num="1">10069</column>
<column num="2">sd</column>
<column num="3">FCVolume </column>
</row>
Run Code Online (Sandbox Code Playgroud)
但是当我解析XML时,我得到了a
org.xml.sax.SAXParseException:字符引用" "是无效的XML字符.
我现在的问题是:我必须替换哪些字符,或者如何编码我的字符,它们将是有效的XML?
我正在使用Probatron4j验证一些针对Schematron样式表的XML文件,Probatron4j在内部使用Saxon.大多数情况下,这工作正常,但偶尔,处理崩溃与错误
org.xml.sax.SAXParseException:1字节UTF-8序列的无效字节1.
我的研究表明,这条消息通常表明(没有特别的顺序)
这些都不适用于我正在处理的文件.我在程序执行期间检查了字节数组形式的输入,它不包含BOM或任何非ASCII字符.
处理通过我的30kb文档的大约五分之一,然后崩溃在一个不起眼的英语句子上("不起眼",我的意思是所有字节都在32(空格)和122(小写z)之间;换句话说,标准键盘字符).假定有问题的元素的字节在这篇文章的末尾.
奇怪的是,失败的文档是通过从较大的文档中删除一些元素来生成的,这些元素被相同的代码干净地处理.
我知道异常是在parse(InputSource input)实现org.xml.saxXMLReader接口的对象的方法中引发的.根据Javadoc,SAXException表示
任何SAX异常,可能包含另一个异常.
检查调试器中的异常表明没有包装异常.
可能导致此错误的原因是什么?
编辑:
[60, 80, 97, 114, 97, 103, 114, 97, 112, 104, 62, 69, 120, 101, 99, 117, 116,
105, 118, 101, 32, 83, 117, 109, 109, 97, 114, 121, 58, 32, 70, 114, 111, 109,
32, 49, 55, 53, 52, 32, 116, 111, 32, 49, 55, 54, 51, 13, …Run Code Online (Sandbox Code Playgroud) 我的 XSLT 转换已经成功了几个月,直到我遇到带有 Unicode 字符(很可能是表情符号)的 XML 文件。我需要保留 Unicode,但 XSLT 正在将其转换为 HTML 实体。我认为将编码设置为 UTF-8 可以解决我的问题,但我仍然遇到问题。
任何帮助表示赞赏。代码:
private byte[] transform(InputStream stream) throws Exception{
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
Transformer xmlTransformer;
xmlTransformer = (TransformerImpl) TransformerFactory.newInstance().newTransformer(new StreamSource(createXsltStylesheet()));
xmlTransformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(stream,"UTF-8");
Source staxSource = new StAXSource(reader, true);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(outputStream, "UTF-8");
xmlTransformer.transform(staxSource, new StreamResult(writer));
return outputStream.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)
如果我添加
xmlTransformer.setOutputProperty(OutputKeys.METHOD, "text");
Run Code Online (Sandbox Code Playgroud)
Unicode 被保留,但 XML 不被保留。
这是我正在使用的代码
try {
String str = "\uC3BC and \uC3B6 and <&> für";
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("test");
root.setAttribute("attribute", str);
doc.appendChild(root);
DOMSource domSource = new DOMSource(doc);
// FileOutputStream out = new FileOutputStream("test.xml");
Writer out = new OutputStreamWriter(new FileOutputStream("test.xml"), "UTF8");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(domSource, new StreamResult(out));
out.close();
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
输出是
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<test attribute="? and ? and <&> für"/>
Run Code Online (Sandbox Code Playgroud)
我希望它输出
attribute="쎼 and 쎶 …Run Code Online (Sandbox Code Playgroud)