- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想读取一个 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/
我有一个包含 805 模板的大型 XSLT 文件,根据系统和环境,该文件会因堆栈溢出而失败。 开发环境为 Windows 7、InfoPath 2010 和 C#。尽管安装了 .NET 4.0,但此版
MSDN for .NET System.Xml.Xsl.XslCompiledTransform 类状态: Thread Safety [1] The XslCompiledTransform ob
我在搞乱编码。 一方面,我有一个以 UTF-8 格式响应我的 url(我非常确定,感谢 firebug 插件)。 我使用以下代码打开读取 UTF-8 内容的 url: StreamReader rea
XslTransform 似乎已被 Microsoft 弃用,而支持 XslCompiledTransform。从理论上讲,如果我在应用程序执行期间只进行一次转换,那么解释 XSLT(通过 XslTr
使用以下代码: XDocument transformedDoc = new XDocument(); using (XmlWriter writer = transformedDoc
我正在尝试使用 XslCompiledTransform,并将输出用作 XPathDocument。 有什么想法吗? 最佳答案 先生。琼斯的回答对我很有帮助,但我发现最后一行不起作用。我最终这样做了:
不幸的是,我正在开发一个对所有内容都使用 XSL 的网站。表现可怕。花在 JIT 上的时间大约是 30%! 我一直认为这家公司需要 4 台服务器来运行其小站点这一事实归结为 XSL,但我终于做了一个适
我想读取一个 xml 文件,应用一个转换,然后写入另一个文件。我能想到的最好的方法是: using (XmlTextReader reader = new XmlTextReader(new File
我正在尝试将大型应用程序从 XslTransform 迁移到已编译的 xsl 文件和 XslCompiledTransform。 应用程序使用 Xsl 创建 HTML 文件,转换数据 (Xml) 通过
我正在使用 XslCompiledTransform 将 XML 文件转换为 HTML。有什么方法可以阻止它使用自闭合标签。 例如 无论我使用哪种浏览器,span 上的自闭合标签都会弄乱我的文
为 制作了一个带有输出指令的 xslt 模板: 在 xsl-debug 中我接收正确 在 html 之上。 但是当我使用 XslCompiledTransform 等时..输出开始于 因此,缺
我有一个 XslCompiledTransform对象,我希望输出为 XmlReader对象,因为我需要通过第二个样式表传递它。我有点困惑 - 我可以成功转换一些 XML 并使用 StreamRead
我试了又试,但我无法在不从磁盘加载样式表(通过将 URI 传递到 XslCompiledTransform.Load() 方法)的情况下进入 XslCompiledTransform。 我完全清楚,如
我有以下代码需要从 VS 2003 (.Net 1.1) 迁移到 VS 2008 (.Net 2+)但我收到编译错误 - System.Xml.Xsl.XslTransform' 已过时:此类已被弃用
我有以下代码,我想使用UTF-8编码格式输出xml数据。但它始终以 UTF-16 格式输出数据: XslCompiledTransform xslt = new XslCompiled
我正在尝试在 Excel 中获取一张表并使用 VBA 创建一个 XML 文档,然后使用 XSLT 样式表转换该文档。 我已经包含了下面的代码,直到我遇到问题为止。 当我尝试像这样创建一个对象时: Di
有人能告诉我为什么会这样吗? 我的 XML 是: some text goes here a top elem today a subnode
以下代码工作并从本地磁盘获取 XSL 和 XML,并将转换后的 XML 返回到变量 Xtransoutput。 Dim XmlInputPath As String = "C:\Any.XML" Di
我使用以下 VB.NET 代码将一些 XML 转换为新的 XML,然后继续处理。这是一次性过程,而不是多次完成的过程,因此据我所知,缓存不会提高效率。 代码有效,但我发现性能问题。我知道性能问题可能与
我有以下 xslt ,我需要使用 xslt 2.0 版功能,如“格式日期”。如何使用 XsltCompiledTransform 类(c#、.net 4.5)声明 Xsl 工作表使用 2.0 版。
我是一名优秀的程序员,十分优秀!