【问题标题】:Bad Characters when parsing GML in Java在 Java 中解析 GML 时出现错误字符
【发布时间】:2011-01-31 19:23:36
【问题描述】:

我正在使用 org.w3c.dom 包来解析 gml 模式 (http://schemas.opengis.net/gml/3.1.0/base/)。

当我解析 gmlBase.xsd 架构然后将其保存回来时,BagType 复杂类型中 GeometryCollections 周围的引号字符会转换为错误字符(参见下面的代码)。

我解析或保存 xml 的方式是否有问题,或者架构中是否存在关闭的内容?

谢谢,

柯蒂斯

public static void main(String[] args) throws IOException
{
   File schemaFile = File.createTempFile("gml_", ".xsd");
   FileUtils.writeStringToFile(schemaFile, getSchema(new URL("http://schemas.opengis.net/gml/3.1.0/base/gmlBase.xsd")));
   System.out.println("wrote file: " + schemaFile.getAbsolutePath());
}

public static String getSchema(URL schemaURL)
{
    try
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(new    StringReader(IOUtils.toString(schemaURL.openStream()))));
        Element rootElem = doc.getDocumentElement();
        rootElem.normalize();

        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer();

        DOMSource source = new DOMSource(doc);
        ByteArrayOutputStream xmlOutStream = new ByteArrayOutputStream();
        StreamResult result = new StreamResult(xmlOutStream);
        transformer.transform(source, result);
        return xmlOutStream.toString();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return "";
}

【问题讨论】:

    标签: java xml schema gml


    【解决方案1】:

    我怀疑这条线:

    Document doc = db.parse(new InputSource(
         new StringReader(IOUtils.toString(schemaURL.openStream()))));
    

    我不知道 IOUtils.toString 在这里做了什么,但大概它假设了一个特定的编码,没有考虑 XML 声明。

    为什么不直接使用:

    Document doc = db.parse(schemaURL.openStream());
    

    同样,您的FileUtils.writeStringToFile 似乎没有指定字符编码...它使用哪种编码,为什么编码在StreamResult 中?

    【讨论】:

    • 你在做某事。如果我将系统属性“file.encoding”更改为“UTF-8”,一切都会按预期工作。但是,如果不设置“file.encoding”属性,我不知道该怎么做。我的应用程序将是已部署的 Web 应用程序。我没有能力更改系统属性。
    • @Curtis:你不应该依赖任何固定的编码。您是否特别需要将架构作为字符串获取?
    • 我想将架构写到一个文件中,以便以后查看。但是,我可能需要在写出之前更改一些 xml 元素,这就是我首先使用 DocumentBuilder 解析它的原因。我如何在不依赖编码的情况下做到这一点?原代码没有指定任何编码,文件出来无效。
    • @Curtis:修改Document形式,然后直接写到流中。
    • 我想我现在明白你的意思了。我使用 xmlOutStream.toByteArray() 而不是 xmlOutStream.toString() 并且它确实维护了编码(无需我指定或更改任何编码设置)。谢谢! (并且不要使用 Apache FileUtils,这也会搞砸)。
    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多