gpt4 book ai didi

c# - 你能得到 XslCompiledTransform 的进展吗?

转载 作者:太空狗 更新时间:2023-10-30 01:28:32 25 4
gpt4 key购买 nike

我想读取一个 xml 文件,应用一个转换,然后写入另一个文件。我能想到的最好的方法是:

using (XmlTextReader reader = new XmlTextReader(new FileStream(_source, FileMode.Open)))
using (XmlTextWriter writer = new XmlTextWriter(new StreamWriter(_destination)))
{
_xslTransform.Transform(reader, writer);
}

但我真的很想取得进步。如果我只是复制数据,我可以做这样的事情(这可能不是 100% 正确,但像这样):

using (BinaryReader reader = new BinaryReader(new FileStream(_source, FileMode.Open)))
using (BinaryWriter writer = new StreamWriter(_destination))
{
byte[] buffer = new byte[2048];
int read = 0;
int actual = 0;
long total = reader.BaseStream.Length;

while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, read);
actual = (actual <= total ? actual + read : read);
updateProgress(Convert.ToInt32(actual / total * 100));
}
}

那么在使用 XslCompiledTransform 时是否有一些方法可以做到这一点。我可以在写入文件之前先将它读入内存,但我想限制使用的内存量,或者 XslCompiledTransform 是否将它全部加载到内存中?

我希望这能说得通,谢谢!

亚当。

最佳答案

一个选项是从转换​​中发送 xsl:message 消息并收听这些消息。

使用这种方法,您必须首先遍历输入文档并计算您的转换“迭代”过的节点。这可以使用非常基本的 XSLT 来完成,它只在每个感兴趣的节点上发送消息。

然后 - 在实际转换期间 - 每次您点击一个感兴趣的节点时,您都​​可以发送一个

<xsl:message terminate="no">progress:mynode</xsl:message>

进度消息。

可以使用消息监听器在调用 C# 代码中拦截此消息。您可以将以下代码放入一个小类中以应用 XSL 转换。这只是一个用于说明的基本示例;我希望你明白了:

protected event MessageListener progressMessageIntercepted;

public void AddProgressMessageListener(MessageListener listener)
{
progressMessageIntercepted += listener;
}

public void RemoveMessageListeners()
{
progressMessageIntercepted = null;
}

protected void MessageCallBack(object sender, XsltMessageEncounteredEventArgs e)
{
if (e.Message.StartsWith("progress:"))
{
if (progressMessageIntercepted != null)
{
progressMessageIntercepted(this, null);
}
}
}

protected void Transform(string inputFile, string outputFile, string xsltFile)
{
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xsltFile);
XsltArgumentList parameters = new XsltArgumentList();
parameters.XsltMessageEncountered += new XsltMessageEncounteredEventHandler(MessageCallBack);

using (XmlWriter xmlWriter = XmlWriter.Create(outputFile))
{
xslt.Transform(inputFile, parameters, xmlWriter);
}
}

关于c# - 你能得到 XslCompiledTransform 的进展吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com