2009-08-17 3 views
1

XslCompiledTransform을 사용하여 한 개체를 다른 개체로 변환하는 일부 기능을 구현하려고합니다.XslCompiledTransform 및 Serialization

개체를 XML 문자열로 serialize하고 XML 문자열을 개체에 DeSerialize하는 몇 가지 구현을 발견했습니다.

또 다른 함수는 object1에서 obejbct2까지 XslCompiledTransform을 수행합니다.

XSLT 파일을 생성하려면 Altova MapForce를 사용하고 직렬화 된 객체의 XML을로드하고 일부 속성을 매핑했습니다. 문제에 대한 지금

는 :

  • 먼저 나는 XslCompiledTransform는 XSLT 버전 2.0에서 작동하지 않는 것으로 나타났습니다. XSLT 2.0에서 작동하는 새로운 함수가 있습니까? 어쩌면 일부 설정?
  • 두 번째로 개체에 XML을 DeSerialize 할 때 예외가 발생합니다. "myObject 형식의 개체를 deserialize하는 동안 오류가 발생했습니다. 입력 문자열의 형식이 올바르지 않습니다." 어디에 문제가 있는지 이해할 수 없습니다. 누구나 그런 일을하는 샘플 코드가 있습니까? Google에서 발견 한 모든 것은 HTML 코드의 변형이며 객체가 아닙니다.

다음은 기능은 다음과 같습니다

private static string runXSLT(string xsltFile, string inputXML) 
     { 
      XmlDocument XmlDoc = new XmlDocument(); 

      // Load the style sheet. 
      XslCompiledTransform xslt = new XslCompiledTransform(true); 
      xslt.Load(xsltFile); 

      StringReader StrReader = new StringReader(inputXML); 
      XmlTextReader XmlReader = new XmlTextReader(StrReader); 


      //Create an XmlTextWriter which outputs to memory stream 
      Stream stream = new MemoryStream(); 
      XmlWriter writer = new XmlTextWriter(stream, Encoding.UTF8); 

      // Execute the transform and output the results to a file. 
      xslt.Transform(XmlReader, writer); 

      stream.Position = 0; 
      XmlDoc.Load(stream); 
      return XmlDoc.InnerXml; 
     } 

public static string SerializeAnObject(object AnObject) 
     { 
      XmlDocument XmlDoc = new XmlDocument(); 
      DataContractSerializer xmlDataContractSerializer = new DataContractSerializer(AnObject.GetType()); 
      MemoryStream MemStream = new MemoryStream(); 
      try 
      { 
       xmlDataContractSerializer.WriteObject(MemStream, AnObject); 
       MemStream.Position = 0; 
       XmlDoc.Load(MemStream); 
       return XmlDoc.InnerXml; 
      } 
      finally 
      { 
       MemStream.Close(); 
      } 

     } 

    public static Object DeSerializeAnObject(string XmlOfAnObject, Type ObjectType) 
    { 
     StringReader StrReader = new StringReader(XmlOfAnObject); 
     DataContractSerializer xmlDataContractSerializer = new DataContractSerializer(ObjectType); 
     XmlTextReader XmlReader = new XmlTextReader(StrReader); 
     try 
     { 
      Object AnObject = xmlDataContractSerializer.ReadObject(XmlReader); 
      return AnObject; 
     } 
     finally 
     { 
      XmlReader.Close(); 
      StrReader.Close(); 
     } 
    } 

덕분에 충당,

오므리.

답변

3
  • XslCompiledTransform은 XSLT 2.0을 지원하지 않습니다. 실제로 XSLT 2.0은 .NET Framework에서 전혀 지원되지 않습니다 (.NET 용 Saxon 버전을 사용해 볼 수도 있지만이 버전은 IKVM 내부에서 실행되는 Java 버전 일뿐입니다).

  • 귀하의 설명을 통해 왜 하나의 객체를 다른 객체로 변환하기 위해 XML을 통해 우회로를 가져 가는지 이해할 수 없었습니다. 입력 객체를 매개 변수로 사용하는 대상 객체에 생성자를 제공하는 것만 큼은 어떨까요? 그런 다음 해당 생성자 내부의 모든 매핑을 코딩 할 수 있습니다. 이것은 객체를 직렬화, 변형 및 직렬화 해제하는 것보다 훨씬 효율적 일뿐만 아니라 C#의 유형 안전성도 얻을 수 있습니다.

+1

XSL 변환을 사용하는 목적은 다른 하드 코딩하지 하나의 객체의 매핑을하는 것입니다 –

+0

새 클래스에 원래의 클래스를 변환하는 생성자를 사용하는 한, 그래서 매핑 속성을 변경할 수 있습니다 프로젝트를 컴파일하지 않아도됩니다. 사실 웹 서비스간에 데이터를 매핑하기 위해 이것을 구축하고 있습니다. WS 1에서 데이터 A를 받고 WS 2에서 데이터 B를 얻습니다. 이제 WS 3에 제출할 새 클래스를 만들어야합니다. 대답 클래스는 객체 A + B로 작성되었습니다. WS 1이 앞으로 반환 될 경우 다른 개체 A (A.name이 A.firstName으로 변경됨) XSLT 파일의 매핑을 변경하고 프로젝트를 다시 컴파일하지 않고 수행 할 수 있습니다. 빠른 답장을 보내 주셔서 감사합니다. –