У меня есть проект, который требует от нас хранить XML в хранилище BLOB-объектов Azure, и у меня возникают проблемы с анализом этих файлов - PullRequest
0 голосов
/ 22 марта 2019

Наш проект требует, чтобы мы сохранили XML в хранилище BLOB-объектов Azure, и сейчас нам нужно проанализировать XML-файл в серверной части, а затем выбрать XML-файл, отфильтровав информацию, хранящуюся в файле, и, наконец, вернуть URL соответствующего файла XML.

Я понятия не имею, какого рода меры могли бы достичь этого, не могли бы вы помочь мне, если у вас есть идея? Большое спасибо.

1 Ответ

0 голосов
/ 26 марта 2019

Я создал простой пример для чтения XML-файлов, хранящихся в хранилище BLOB-объектов Azure, их анализа и фильтрации по условию для вывода списка URL-адресов BLOB-объектов.В моем примере используется Azure Storage SDK v8.0.0 для Java и анализатор HTML jsoup в Java.

Ниже приведены зависимости моего проекта maven.

<!-- https://mvnrepository.com/artifact/com.microsoft.azure/azure-storage -->
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-storage</artifactId>
    <version>8.0.0</version>
</dependency>
<dependency>
    <!-- jsoup HTML parser library @ https://jsoup.org/ -->
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>

Содержимое XML, которое я использовал в своем проекте, выглядит так, как показано ниже, и есть 6 файлов для тестирования.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "person.dtd">
<person>
    <name>Peter Pan</name>
    <gender>Male</gender>
    <age>30</age>
</person>

И код такой, как показано ниже.

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.InvalidKeyException;
import java.sql.Date;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.blob.ListBlobItem;
import com.microsoft.azure.storage.blob.SharedAccessBlobPermissions;
import com.microsoft.azure.storage.blob.SharedAccessBlobPolicy;

public class FilterXMLFiles {

    private static final String storageConnectionString = "<your storage account connection string>";
    private static final String containerName = "xmls"; // It's my container to store these XML files.

    private static CloudBlobClient serviceClient;

    public static void main(String[] args) throws InvalidKeyException, URISyntaxException, StorageException, MalformedURLException, IOException {
        CloudStorageAccount account = CloudStorageAccount.parse(storageConnectionString);
        serviceClient = account.createCloudBlobClient();
        CloudBlobContainer container = serviceClient.getContainerReference(containerName);
        // Generate a SAS token for reading XML files in the container
        SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
        policy.setPermissions(EnumSet.allOf(SharedAccessBlobPermissions.class));
        policy.setSharedAccessStartTime(Date.valueOf(LocalDate.now().minusYears(2)));
        policy.setSharedAccessExpiryTime(Date.valueOf(LocalDate.now().plusYears(2)));
        String token = container.generateSharedAccessSignature(policy, null);
        // Get the list of blobs in the container.
        Iterator<ListBlobItem> blobs = container.listBlobs().iterator();
        // Create a List object to store these filtered urls.
        List<String> blobUrls = new ArrayList<>();
        while(blobs.hasNext()) {
            // Get the blob url with SAS token
            String uri = blobs.next().getUri().toString();
            String urlWithSAS = String.format("%s?%s",uri, token);
            // System.out.println(urlWithSAS);
            // Parse and filter by jsoup with the condition age >= 30
            Document root = Jsoup.parse(new URL(urlWithSAS), 30*1000);
            int age = Integer.parseInt(root.selectFirst("age").text());
            if(age >= 30) { // It's the condition age >=30
                blobUrls.add(uri);
            //  blobUrls.add(urlWithSAS);
            }
        }
        System.out.println(String.join("\n", blobUrls));
    }

}

Результатвыглядит так:

https://<my account name>.blob.core.windows.net/xmls/p1.xml
https://<my account name>.blob.core.windows.net/xmls/p3.xml
https://<my account name>.blob.core.windows.net/xmls/p5.xml

Пример настолько прост для объяснения моей идеи.Конечно, в реальном прикладном сценарии, учитывая гибкость запросов фильтра, я думаю, используя XQuery, как SQL, чтобы понять, что это лучшее решение, такое как Saxon (сторонняя библиотека на Java) вместо jsoup для фильтрации по XQuery Expression в качестве условия.Для получения более подробной информации о XQuery вы можете обратиться к Xquery Tutorial и документам Saxon.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...