2008-09-05 2 views
10

.xml의 구성 중 일부를 나타내는 클래스 라이브러리를 사용하고 있습니다. 구성은 XmlSerializer을 사용하여 읽습니다. 다행스럽게도 .xml을 나타내는 클래스는 XmlAnyElement 속성을 사용하여 원래 클래스 라이브러리를 수정하지 않고 구성 데이터를 내 용도로 확장 할 수 있습니다.XmlSerializer.Serialize에 대한 호출을 통해 XmlNode를 만드는 방법은 무엇입니까?

<?xml version="1.0" encoding="utf-8"?> 
<Config> 
    <data>This is some data</data> 
    <MyConfig> 
    <data>This is my data</data> 
    </MyConfig> 
</Config> 

이것은 비 직렬화에 적합합니다. 클래스 라이브러리가 정상적으로 .xml을 비 직렬화 할 수있게하고 내부 에 대해 XmlNodeReader과 함께 내 자신의 XmlSerializer 인스턴스를 사용할 수 있습니다.

public class Config 
{ 
    [XmlElement] 
    public string data; 

    [XmlAnyElement] 
    public XmlNode element; 
} 

public class MyConfig 
{ 
    [XmlElement] 
    public string data; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (Stream fs = new FileStream(@"c:\temp\xmltest.xml", FileMode.Open)) 
     { 
      XmlSerializer xser1 = new XmlSerializer(typeof(Config)); 
      Config config = (Config)xser1.Deserialize(fs); 

      if (config.element != null) 
      { 
       XmlSerializer xser2 = new XmlSerializer(typeof(MyConfig)); 
       MyConfig myConfig = (MyConfig)xser2.Deserialize(new XmlNodeReader(config.element)); 
      } 
     } 
    } 

나는 사용자가 읽을되지 않은 그래서 새로운 객체가 생성 될 클래스 라이브러리 구성뿐만 아니라 내 자신의 구성을 모두 포함하는 새로운 구성 파일을 생성 할 수있는 유틸리티를 작성해야합니다. XML 파일. 문제는 데이터를 .xml로 다시 직렬화하는 방법입니다.

클래스 라이브러리 구성에서 동일한 메소드를 호출하기 전에 처음에 데이터에 XmlSerializer.Serialize을 호출해야한다는 것을 알고 있습니다. 그러나이 경우 Serialize을 호출 한 후 내 데이터가 XmlNode으로 표시되어야합니다. XmlSerializer을 사용하여 객체를 XmlNode으로 직렬화하는 가장 좋은 방법은 무엇입니까?

감사합니다,

케빈이

그것은 크리스 Lovett에 의해 작성된 XmlNodeWriter 클래스처럼 보이는 btw-- Microsoft에서 한 번에 가능했지만, 링크가 깨져 있습니다. 누구든지이 수업을들을 수있는 대체 위치를 알고 있습니까?

답변

9

클래스에 맞춤 구성 정보가 포함되어 있어야하고 해당 클래스를 XML로 직렬화 한 다음 직렬화 된 XML을 XML 노드로 만들면됩니다. 맞습니까?

XMLSerializer에서 생성 한 문자열을 가져 와서 XML 태그로 감쌀 수 있습니까?

XmlSerializer xs = new XmlSerializer(typeof(MyConfig)); 
StringWriter xout = new StringWriter(); 
xs.Serialize(xout, myConfig); 
XmlDocument x = new XmlDocument(); 
x.LoadXml("<myConfig>" + xout.ToString() + "</myConfig>"); 

지금 X는 당신의 직렬화 된 사용자 정의 구성을 가지고 하나 개의 요소 "< MyConfig를 >"를 포함하는을 XmlDocument입니다.

당신이 찾고있는 것이 전부입니까?

0

내부 개체를 문자열로 serialize 한 다음이 문자열을 XmlDocument로로드하여 데이터를 나타내는 XmlNode를 찾고 외부 개체에 연결할 수 있습니다.

XmlSerializer xser1 = new XmlSerializer(typeof(Config)); 
XmlSerializer xser2 = new XmlSerializer(typeof(MyConfig)); 

MyConfig myConfig = new MyConfig(); 
myConfig.data = "My special data"; 

StringBuilder sb = new StringBuilder(); 
StringWriter sw = new StringWriter(sb); 
XmlWriter xw = new XmlTextWriter(sw); 
xser2.Serialize(xw, myConfig); 

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(sb.ToString()); 

Config config = new Config(); 
config.data = "some new info"; 
config.element = doc.LastChild; 

xser1.Serialize(fs, config); 

그러나이 솔루션은 번거롭고 더 나은 방법이 있기를 바랍니다.하지만 지금은 내 문제를 해결합니다.

이제 여러 블로그에서 언급 한 신화 XmlNodeWriter를 찾을 수 있다면!

0

적어도 하나의 리소스가 XmlNodeWriter : http://msdn.microsoft.com/en-us/library/5x8bxy86.aspx 대신이 점을 지적합니다. 그렇지 않으면 XmlNodeWriter를 찾고있는 GotDotNet의 새로운 MSDN 코드 라이브러리 대체품에있는 양식을 사용하여 MS를 작성할 수 있습니다.

//DataContractSerializer serializer = new DataContractSerializer(typeof(foo)); 
XmlSerializer serializer = new XmlSerializer(typeof(foo)); 

XmlDocument doc = new XmlDocument(); 
XPathNavigator nav = doc.CreateNavigator(); 
XmlWriter writer = nav.AppendChild(); 
writer.WriteStartDocument(); 
//serializer.WriteObject(writer, new foo { bar = 42 }); 
serializer.Serialize(writer, new foo { bar = 42 }); 
writer.WriteEndDocument(); 
writer.Flush(); 
writer.Close(); 

Console.WriteLine(doc.OuterXml); 
3

그것은 약간의 작업을했다,하지만 XPathNavigator를 경로가 ... 단지 XmlWriter를에 .Close를 호출하는 작업 기억 않습니다 .Flush()는 아무것도하지 않습니다 `원하는 'XmlNode`를 반환합니다.
+0

'doc.DocumentElement : – tm1

관련 문제