Azure 将Blob从BlobStorage加载到XslCompiledTransform.Load()中
我在AzureBlobStorage中有一个XSLT文件 我需要将该Blob加载到XslCompiledTransform.Load()中 我试过使用MemoryStream和StreamReader等Azure 将Blob从BlobStorage加载到XslCompiledTransform.Load()中,azure,azure-storage-blobs,Azure,Azure Storage Blobs,我在AzureBlobStorage中有一个XSLT文件 我需要将该Blob加载到XslCompiledTransform.Load()中 我试过使用MemoryStream和StreamReader等 请在这方面提供帮助。我尝试了MemoryStream,效果很好。请参阅下面的代码 var stream_xslt = new MemoryStream(); await blob_xslt.DownloadToStreamAsync(stream_xslt); stream_xslt.Posit
请在这方面提供帮助。我尝试了
MemoryStream
,效果很好。请参阅下面的代码
var stream_xslt = new MemoryStream();
await blob_xslt.DownloadToStreamAsync(stream_xslt);
stream_xslt.Position = 0;
var stream_xml = new MemoryStream();
await blob_xml.DownloadToStreamAsync(stream_xml);
stream_xml.Position = 0;
XslCompiledTransform xslt = new XslCompiledTransform();
StringBuilder stringBuilder = new StringBuilder();
xslt.Load(XmlReader.Create(stream_xslt));
xslt.Transform(XmlReader.Create(stream_xml),
XmlWriter.Create(stringBuilder));
要使用uri访问blob,如果其访问级别不是公共的,则必须使用uri。由于您可以连接到存储帐户,因此,如果blob有效,则首选将其下载到流 这个答案适用于你的问题
CloudBlobClient blobClient = GetCloudBlobContainer();
CloudBlob blob_xslt = blobClient.GetContainerReference("container1").GetBlobReference("name.xslt");
CloudBlob blob_xml = blobClient.GetContainerReference("container2").GetBlobReference(name.xml);
StringBuilder stringBuilder = new StringBuilder();
XslCompiledTransform xslt = new XslCompiledTransform();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.CloseOutput = false;
string xml_string = null;
string xslt_string = null;
using (var xmlstream = await blob_xml.OpenReadAsync())
{
using (var xsltstream = await blob_xslt.OpenReadAsync())
{
StreamReader xmlreader = new StreamReader(xmlstream);
StreamReader xsltreader = new StreamReader(xsltstream);
while (!xmlreader.EndOfStream && !xsltreader.EndOfStream)
{
xml_string = xmlreader.ReadToEnd();
xslt_string = xsltreader.ReadToEnd();
}
byte[] byteArray = Encoding.UTF8.GetBytes(xslt_string);
var tmpFile = Path.GetTempFileName();
var tmpFileStream = System.IO.File.OpenWrite(tmpFile);
tmpFileStream.Write(byteArray, 0, byteArray.Length);
tmpFileStream.Close();
xslt.Load(tmpFile);
byte[] byteArray1 = Encoding.UTF8.GetBytes(xml_string);
var tmpFile1 = Path.GetTempFileName();
var tmpFileStream1 = System.IO.File.OpenWrite(tmpFile1);
tmpFileStream1.Write(byteArray1, 0, byteArray1.Length);
tmpFileStream1.Close();
xslt.Transform(tmpFile1, XmlWriter.Create(stringBuilder, settings));
}
}
blob应该可以公开访问。当您获取blob URL并将其粘贴到浏览器的地址栏时会发生什么?您是否能够看到文件的内容,或者是否收到404错误?资源未找到错误即将出现。但是在那个容器里发现了一个水滴。是否有其他方法加载该文件@Gauravmantri您所说的
是什么意思,但在该容器中找到了blob
?您的意思是在存储资源管理器中浏览blob时可以看到它吗?当我公开blob时,当我尝试加载blob url时,xml文件将加载为html。如果不是的话。。引发Private(未找到资源)错误@高拉夫曼特里
CloudBlobClient blobClient = GetCloudBlobContainer();
CloudBlob blob_xslt = blobClient.GetContainerReference("container1").GetBlobReference("name.xslt");
CloudBlob blob_xml = blobClient.GetContainerReference("container2").GetBlobReference(name.xml);
StringBuilder stringBuilder = new StringBuilder();
XslCompiledTransform xslt = new XslCompiledTransform();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.CloseOutput = false;
string xml_string = null;
string xslt_string = null;
using (var xmlstream = await blob_xml.OpenReadAsync())
{
using (var xsltstream = await blob_xslt.OpenReadAsync())
{
StreamReader xmlreader = new StreamReader(xmlstream);
StreamReader xsltreader = new StreamReader(xsltstream);
while (!xmlreader.EndOfStream && !xsltreader.EndOfStream)
{
xml_string = xmlreader.ReadToEnd();
xslt_string = xsltreader.ReadToEnd();
}
byte[] byteArray = Encoding.UTF8.GetBytes(xslt_string);
var tmpFile = Path.GetTempFileName();
var tmpFileStream = System.IO.File.OpenWrite(tmpFile);
tmpFileStream.Write(byteArray, 0, byteArray.Length);
tmpFileStream.Close();
xslt.Load(tmpFile);
byte[] byteArray1 = Encoding.UTF8.GetBytes(xml_string);
var tmpFile1 = Path.GetTempFileName();
var tmpFileStream1 = System.IO.File.OpenWrite(tmpFile1);
tmpFileStream1.Write(byteArray1, 0, byteArray1.Length);
tmpFileStream1.Close();
xslt.Transform(tmpFile1, XmlWriter.Create(stringBuilder, settings));
}
}