Передача null в метод `XslCompiledTransform.Transform` - PullRequest
2 голосов
/ 09 мая 2011

Я пытаюсь преобразовать и XML-документ, используя XSL. Я не слишком знаком с тем, как преобразовать XML в .NET, поэтому я использую некоторый пример кода ...

XslCompiledTransform xslTransformer = new XslCompiledTransform();
xslTransformer.Load(Server.MapPath("Test.xslt"));

MemoryStream ms = new MemoryStream();
xslTransformer.Transform(Server.MapPath("Test.xml"), null, ms);

ms.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(ms);
string output = sr.ReadToEnd();
ms.Close();

Response.Write(output); 

Проблема, с которой я сталкиваюсь, заключается в следующей строке ...

xslTransformer.Transform(Server.MapPath("Test.xml"), null, ms);

Компилятор показывает ошибку при передаче null в метод Transform. При взгляде на сигнатуры метода Transform выглядит, что параметр null представляет различные варианты преобразования. Visual Studio IDE даже показывает, что это значение может быть null. Я также попытался использовать DBNull.Value, но это также показывает ошибку. Есть идеи, что мне не хватает?

ОБНОВЛЕНИЕ: Я получаю ошибку в два раза. (1) Сначала мне говорят, что null больше не поддерживается, и я должен использовать System.DBNull. (2) Как только я меняю null на System.DBNull, я получаю сообщение об ошибке overload resolution failed because no accessible Transform can be called with these arguments.

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Вы можете попробовать использовать другую XslCompiledTransform.Transform метод перегрузки , который принимает путь строки и XmlWriter :

XslCompiledTransform xslTransformer = new XslCompiledTransform();
xslTransformer.Load(Server.MapPath("Test.xslt"));

// XmlWriter allows you to specify additional settings
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.CloseOutput = false;

using (MemoryStream ms = new MemoryStream())
{
    using (XmlWriter writer = XmlWriter.Create(ms, settings))
    {
        xslTransformer.Transform(Server.MapPath("Test.xml"), writer);
    }

    ms.Seek(0, SeekOrigin.Begin);
    StreamReader sr = new StreamReader(ms);
    string output = sr.ReadToEnd();
    ms.Close();
}

Response.Write(output); 

На самом деле, есливас интересует только рендеринг XML в строку, вы можете использовать StringBuilder в качестве цели без MemoryStream и упростить свой код до:

XslCompiledTransform xslTransformer = new XslCompiledTransform();
xslTransformer.Load(Server.MapPath("Test.xslt"));

StringBuilder sb = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(sb))
{
    xslTransformer.Transform(Server.MapPath("Test.xml"), writer);
}

Response.Write(sb.ToString()); 

[Редактировать] (на основе вашего комментария)

Если входной XML находится в строке, вы можете использовать еще одну перегрузку метода XslCompiledTransform.Transform: Transform(XmlReader, XmlWriter).

XmlReader может быть (среди прочих способов) реализован с использованием конкретной реализации TextReader, в данном случае StringReader.Вы также можете использовать другой поток в качестве входных данных.

Когда вы соберете все это вместе, вы должны получить:

string input = @"<SomeXml />"
StringBuilder output = new StringBuilder();
using (StringReader strReader = new StringReader(input))
{
   using (XmlReader reader = XmlReader.Create(strReader))
   {
      using (XmlWriter writer = XmlWriter.Create(output))
      {
          xslTransformer.Transform(reader, writer);
      }
   }
}
Response.Write(output.ToString()); 

Все эти классы реализуют IDisposable, поэтому вам нужночтобы убедиться, что они утилизируются после использования.

0 голосов
/ 09 мая 2011

Вы уверены, что это средний аргумент, который вызывает ошибку?Возможно Server.MapPath("Test.xml") возвращает ноль?

...