gpt4 book ai didi

C# - 是否可以(以及如何)使用 SgmlReader 执行 XSL 转换

转载 作者:太空狗 更新时间:2023-10-29 15:09:28 25 4
gpt4 key购买 nike

我需要使用 XSLT 转换 HTML 网页的内容.因此我使用了 SgmlReader并编写了如下所示的代码片段(我我想,最后,它也是一个 XmlReader ...)

XmlReader xslr = XmlReader.Create(new StringReader(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">" +
"<xsl:output method=\"xml\" encoding=\"UTF-8\" version=\"1.0\" />" +
"<xsl:template match=\"/\">" +
"<XXX xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><xsl:value-of select=\"count(//br)\" /></XXX>" +
"</xsl:template>" +
"</xsl:stylesheet>"));

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xslr);

using (SgmlReader html = new SgmlReader())
{
StringBuilder sb = new StringBuilder();
using (TextWriter sw = new StringWriter(sb))
using (XmlWriter xw = new XmlTextWriter(sw))
{
html.InputStream = new StringReader(Resources.html_orig);
html.DocType = "HTML";

try
{
xslt.Transform(html, xw);
string output = sb.ToString();
System.Console.WriteLine(output);
}
catch (Exception exc)
{
System.Console.WriteLine("{0} : {1}", exc.GetType().Name, exc.Message);
System.Console.WriteLine(exc.StackTrace);
}
}
}

尽管如此,我还是收到了那些错误信息

NullReferenceException : Object reference not set to an instance of an object.
at MS.Internal.Xml.Cache.XPathDocumentBuilder.Initialize(XPathDocument doc, IXmlLineInfo lineInfo, String baseUri, LoadFlags flags)
at MS.Internal.Xml.Cache.XPathDocumentBuilder..ctor(XPathDocument doc, IXmlLineInfo lineInfo, String baseUri, LoadFlags flags)
at System.Xml.XPath.XPathDocument.LoadFromReader(XmlReader reader, XmlSpace space)
at System.Xml.XPath.XPathDocument..ctor(XmlReader reader, XmlSpace space)
at System.Xml.Xsl.Runtime.XmlQueryContext.ConstructDocument(Object dataSource, String uriRelative, Uri uriResolved)
at System.Xml.Xsl.Runtime.XmlQueryContext..ctor(XmlQueryRuntime runtime, Object defaultDataSource, XmlResolver dataSources, XsltArgumentList argList, WhitespaceRuleLookup wsRules)
at System.Xml.Xsl.Runtime.XmlQueryRuntime..ctor(XmlQueryStaticData data, Object defaultDataSource, XmlResolver dataSources, XsltArgumentList argList, XmlSequenceWriter seqWrt)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer, Boolean closeWriter)
at System.Xml.Xsl.XmlILCommand.Execute(XmlReader contextDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter results)
at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XmlWriter results)

我通过将 HTML 转换为 XML 然后应用转换找到了解决此问题的方法,但这是一个低效的解决方案,因为:

  1. 中间 XHTML 输出到缓冲区,因此需要额外的内存
  2. 转换过程需要额外的 CPU 处理并且相同的层次结构被遍历两次(理论上没有必要)。

所以(因为我知道 StackOverflow 社区总是提供很好的答案,而其他 C# 论坛让我完全失望 ;o) 我会寻找反馈和建议,以便直接使用 HTML 执行 XSL 转换(即使 SgmlReader 需要被另一个类似的库替换)。

最佳答案

即使 SgmlReader 类扩展了 XmlReader 类,也不意味着它的行为也像 XmlReader.

从技术上讲,SgmlReaderXmlReader 的子类也没有意义,因为 SGML 是 XML 的超集而不是子集。

你没有写你转型的目的,但总的来说 HTML Agility Pack 是操作 HTML 的好选择。

关于C# - 是否可以(以及如何)使用 SgmlReader 执行 XSL 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4315195/

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