使用XPathDocument在C#中执行XSL转换的路径中的XML非法字符

时间:2016-05-14 23:05:43

标签: c# xml string xslt xpath

我在string中有一个XML,我需要使用html实际转换为xsl

我使用XslCompiledTransform进行转换。为了实现这一点,我使用XPathDocument解析包含XML到XML的字符串。

但是,如果我尝试将string直接解析为XPathDocument,那么我会收到错误:

  

路径中的非法字符。

所以我必须包含StringReader才能将字符串解析为XPathDocument。 (使用我在下面链接的帖子中的解决方案。)

这是我的一步一步程序:

  1. 从SDL Trados Studio检索string,它取决于正在处理的XML(最初如何创建和加载翻译)string有时会有{ {3}}有时不会。实际上,'xml'是从源文本和目标文本以及结构元素的片段中解析出来的。文本元素将转义为xml,标记和文本将合并为一个string。 (关于删除BOM的单独帖子是BOM。)

  2. 然后使用stringXPathDocument解析为StringReader

  3. 使用XslCompiledTransformStringBuilder StringWriter完成转换。

  4. 已转换的xml(现在为html)已保存到文件中。

  5. 这是我的代码:

    //Recreate XML file using an extractor returns a string array
    string strSourceXML = String.Join("", extractor.TextSrc);
    
    //strip BOM
    strSourceXML = strSourceXML.Substring(strSourceXML.IndexOf("<?"));
    
    //Transform XML with the preview XSL
    var xSourceDoc = new XPathDocument(strSourceXML);
    
    //Load XSL
    var xTr = new XslCompiledTransform();
    var xslt = Settings.GetValue("WordPreview", "XSLTpath", "");
    xTr.Load(xslt);
    
    //Parse XML string
    dynamic xSourceDoc;
    using (StringReader s = new StringReader(strSourceXML))
    {
        xSourceDoc = new XPathDocument(s);
    }
    
    //Transform the XML
    StringBuilder sb1 = new StringBuilder();
    StringWriter swSource = new StringWriter(sb1);
    xTr.Transform(xSourceDoc, null, swSource);
    
    //Transformed file saved to the disk
    string tmpSourceDoc = Path.GetTempFileName();
    
    System.IO.StreamWriter writer1 = new System.IO.StreamWriter(tmpSourceDoc, false, Encoding.Unicode);
    writer1.Write(sb1.ToString());
    writer1.Close();
    

    我的问题是:有没有更简单的方法来解决它?有没有建议使用XSLT直接转换字符串?或者如果没有,是否有直接的方法将字符串解析为XPathDocument?

    我搜索了Stack Overflow上的很多帖子,例如:

    但他们都没有给我解决方案来做到这一点更简单。任何建议都是受欢迎的。感谢。

1 个答案:

答案 0 :(得分:1)

不需要中级StringBuilderStringWriter XsltCompiledTransform实例可以立即写入磁盘上的流。

string strSourceXML = string.Concat(extractor.TextSrc);

strSourceXML = strSourceXML.Substring(strSourceXML.IndexOf("<?"));

var xTr = new XslCompiledTransform();
var xslt = Settings.GetValue("WordPreview", "XSLTpath", "");
xTr.Load(xslt);

string tmpSourceDoc = Path.GetTempFileName();

using (var reader = new StringReader(strSourceXML))
using (var writer = new StreamWriter(tmpSourceDoc, false, Encoding.Unicode))
{
    var xSourceDoc = new XPathDocument(reader);
    xTr.Transform(xSourceDoc, null, writer);
}