Я создал простой пример для чтения 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
.