2012-09-20 1 views
0

클래스 Rule에 직렬화를 해제하려는 다음 XML이 있습니다 (아래 참조). 내 xml 입력의 매개 변수 노드에서 xml 내용을 텍스트로 저장할 수있는 xml 속성의 불가사의 한 조합을 찾지 못했습니다. 속성이 Name = "Rule1"이고 속성이 Parameters = "<User>Tommy</User><Database>local</Database>".Net 사용하기 다음 XML을 어떻게 deserialize합니까?

인 Rule 유형의 개체가 필요합니다. 미리 감사드립니다.

편집 : 충분히 명확하지 않다고 생각합니다. 매개 변수라는 전체 노드를 사용자 정의 클래스가 아닌 문자열로 직렬화해야합니다. 일례로서 XML 문서를 포함하는 처리 된 경우 나 다른 XML 문서이

<Parameters> 
    <A>aaaa</A> 
    <B>bbbb</B> 
    </Parameters> 

를 포함하는 경우, 문자열 "< X> XXXX < Y> YYYY" 직렬화 복원해야이

<Parameters> 
    <X>xxxx</X> 
    <Y>yyyy</Y> 
    </Parameters> 

나는,132 같은 OOP의 방법을 사용하는 것을 고려하십시오이

+1

은''Serializable' 만 IFormatter' 기반 직렬 들어 XmlSerializer' '용 실제로 필요하지 않다 (즉,'BinaryFormatter'). – luksan

+0

@DJ KRAZE - 응답 해 주셔서 감사합니다.하지만 귀하의 링크는 내 질문에 답하지 않습니다. XML 형식의 텍스트를 문자열로 비 직렬화해야합니다. – user481779

+0

당신은 그냥 처음부터 연구를하지 않고 빠른 수정을 찾는 Google 검색을 중지 할 수 – MethodMan

답변

2

?

XElement xDoc = XElement.Parse(xml); //or XElement.Load(...) 
Rule rule = new Rule() 
{ 
    Name = (string)xDoc.Element("Name"), 
    Parameters = String.Join("",xDoc.Element("Parameters").Elements()) 
}; 

-

class Rule 
{ 
    public string Name { get; set; } 
    public string Parameters { get; set; } 
} 
+0

질문에 대한 답변이 될 정도로 간단합니다. 감사. – user481779

0

"BBBB < A> AAAA < B>"문자열로 직렬화 복원 필요 10 건의 제안.

그렇지 않으면, 내가 XmlSerializer 지원을 위해 두 개의 자리 표시 자 클래스를 만들 것 다음

class Rule 
{  
    public string Name { get; set; }  
    public string Parameters { get; set; } 
} 

class XmlRule 
{ 
    [XmlElement("Name")] 
    public string Name { get; set; } 
    [XmlElement("Parameters")] 
    public Parameters Parameters { get; set; } 
} 

class XmlParameters 
{ 
    [XmlElement("User")] 
    public string User { get; set; } 
    [XmlElement("Database")] 
    public string Database { get; set; } 
} 

public Rule CreateRule(string xml) 
{ 
    XmlRule xmlRule = Deserialize(xml); // deserialize as you would do usually 

    Rule result = new Rule 
    { 
     Name = xmlRule.Name, 
     Parameters = CreateParametersXml(xmlRule.Parameters) 
    }; 

    return result; 
} 

private string CreateParametersXml(XmlParameters parameters) 
{ 
    return string.Format("<User>{0}</User><Database>{1}</Database>", 
         parameters.User, 
         parameters.Database); 
} 
어쩌면

하지 "<User>{0}</User><Database>{1}</Database>" 물건을 하드이기 때문에 최선의 해결책처럼 어쩌면 문자열로 개체를 변환 무엇 그것은 아니다 좋은. 그러나 OOP가 아닌 모델을 가지고 있다는 생각이 문제가 될 것이라고 생각하기 때문에 이것이 가장 간단한 해결책 인 것 같습니다.

public static string DeserializeToString(object obj) 
     { 
      var serializer = new XmlSerializer(obj.GetType()); 
      var ns = new XmlSerializerNamespaces(); 
      ns.Add("", ""); 
      var ms = new MemoryStream(); 
      var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = new UnicodeEncoding(false, false) }; 
      var writer = XmlWriter.Create(ms, settings); 
      serializer.Serialize(writer, obj, ns); 

      return Encoding.Unicode.GetString(ms.ToArray()); 

     } 

그것은 네임 스페이스와 XML 선언을 생략 객체를 가지고 문자열로 변환합니다 :

+0

나는 명확성을 위해 내 질문을 편집했습니다 – user481779

0

이 방법을 사용해보십시오.

사용과 같은 : 충분히 간단한

var rule = new Rule(); 
rule.Name = "name"; 
rule.Parameters = new Parameters(); 
rule.Parameters.User = "username"; 
rule.Parameters.Database = "database"; 

var stringResults = DeserializeToString(rule); 
+0

나는 명확성을 위해 내 질문을 편집했습니다 – user481779

관련 문제