【问题标题】:How can I parse an XML file stored in blobstore on Google App Engine?如何解析存储在 Google App Engine 上的 blobstore 中的 XML 文件?
【发布时间】:2012-08-30 13:37:30
【问题描述】:

我需要解析存储在 blobstore 中的 XML 文件。我该怎么做?

这是我到目前为止所做的:

FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.getBlobFile(new BlobKey(key));

我无法使用 javax.xml 包解析 XML 文件,或者可以吗?如果将该包中的类付诸实施,则需要引用 java.io.File 对象。但我没有那个。

这是我到目前为止一直在做的事情:(不是在服务器上,而是在本地)

         File blobKeys = new File("/home/non-admin/NetBeansProjects/Personal Site_Testers/web/xml/xml_1.xml");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(blobKeys);
        Element root = doc.getDocumentElement();

        Element firstName = doc.createElement("first-name");
        firstName.setTextContent(name);

        root.appendChild(firstName);

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("/home/non-admin/NetBeansProjects/Personal Site_Testers/web/xml/xml_1.xml"));
        transformer.transform(source, result);

注意:有 3 个 xml 文件上传到 blobstore。那些 xml 文件只有一个根标签。我想获取 xml 引用并解析它们以根据请求多次附加子节点。

【问题讨论】:

  • 也许这可以帮助你:code.google.com/p/gaevfs
  • @WimDeblauwe 对我有什么帮助?
  • 这只是我发现在获取实际 File 对象时可能有用的东西。但我认为@zsxwing 的建议要好得多。你应该像他说的那样使用 FileService。

标签: java google-app-engine xml-parsing blobstore


【解决方案1】:

如果你想解析*.xml,我认为jdom2可能更方便,我在应用引擎中使用它并且它可以工作。

但是,您可以阅读FileService API 文档,并且有一个如何读取和写入文件的示例。如果可以得到一个InputStream或者Reader,那么就可以使用javax.xml来解析InputStream或者Reader中的xml内容。

    FileService fileService = FileServiceFactory.getFileService();
    AppEngineFile readableFile = new AppEngineFile("your_file_name");
    FileReadChannel readChannel = fileService.openReadChannel(readableFile,
            false);
    InputStream input = Channels.newInputStream(readChannel);

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(input);

    Element root = doc.getDocumentElement();

    Element firstName = doc.createElement("first-name");
    firstName.setTextContent("content");

    root.appendChild(firstName);
    // Now write
    GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
            .setBucket("mybucket").setKey("myfile")
            .setMimeType("text/html").setAcl("public_read")
            .addUserMetadata("myfield1", "my field value"); // change as
                                                            // your need
    AppEngineFile writableFile = fileService.createNewGSFile(optionsBuilder
            .build());
    FileWriteChannel writeChannel = fileService.openWriteChannel(
            writableFile, false);
    OutputStream output = Channels.newOutputStream(writeChannel);

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    DOMSource source = new DOMSource(doc);
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    StreamResult result = new StreamResult(output);
    transformer.transform(source, result);

【讨论】:

  • 我想用 javax.xml 在本地计算时提供的高层抽象来解析 xml
  • 您自己也创建 XML 吗?如果您只想以高级方式将对象序列化和反序列化到 XML 或从 XML 反序列化,您可能想尝试 XStream
  • 有 3 个 xml 文件上传到 blobstore。那些 xml 文件只有一个根标签。现在我想获取 xml 引用并解析它们以附加一个子节点。这就是我想做的一切。
  • 你的意思是要解析xml文件并在某些节点上附加一些东西吗?当你尝试这样做时有什么问题?
  • 首先,你可以得到一个xml文件的Reader。然后,您使用 javax.xml API 来解析 Reader。我认为没关系。当您尝试这样做时会出现什么错误?
猜你喜欢
  • 1970-01-01
  • 2013-06-19
  • 2011-05-30
  • 2011-06-01
  • 2020-03-09
  • 2015-04-07
  • 2011-05-05
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多