2009-05-22 5 views
2

IXmlSerializable의 ReadXml() 메서드를 구현 중이며 XPath를 사용하여 그림을 그려 보는 것이 가장 좋은 방법 일 수 있습니다.XPath를 사용하여 IXmlSerializable ReadXml()을 구현하는 가장 좋은 방법

그러나 ReadXml()은 판독기 위치를 올바르게 처리해야합니다.

<ObjectName> 
    <SubNode>2</SubNode> 
    <SubNode>2</SubNode> 
</ObjectName> 

제대로 나중에 위치 독자를 확보하는 것보다 더 좋은 방법 (이 끔찍한 방법) 아래 있는가 :

그래서 내되는 WriteXml()이 같은 생산 주어진?

public override void ReadXml(System.Xml.XmlReader reader) 
{ 
     reader.Read(); /* Read Opening tag */ 
     /* Using reader.ReadStartElement("ObjectName") reads forward a node, 
      i.e. current node becomes the first <SubNode> 
      whereas Read() doesn't even when the documentation says they both do 
     */ 
     XPathNavigator n = MakeXPathNavigator(reader.ReadSubtree()); 
     XPathNodeIterator nodes = n.Select(".//SubNode"); 
     while (nodes.MoveNext()) 
     { 
      /* Do stuff with nodes */ 
      _values.Add(nodes.Current.ValueAsInt); 
     } 
     reader.Skip(); /* Skip reader forward */ 
} 

public static XPathNavigator MakeXPathNavigator(XmlReader reader) 
{ 
    try 
    { 
     return new XPathDocument(reader).CreateNavigator(); 
    } 
    catch(XmlException e) 
    { 
     throw e; /* Maybe hide/deal with exception */ 
    } 
} 

답변

2

이러한 접근 방식을 일상적으로 사용하는 경우 성능 문제가 발생할 수 있습니다. 귀하의 XML이 상대적으로 간단하기 때문에, 나는 당신이 직접 XmlReader을 사용하는 것이 더 낫다고 생각합니다 ...

...하지만 그렇게 쉽지는 않습니다. IMO, IXmlSerializable (일반 컬렉션 속성을 사용하는 juts)을 구현할 필요가 없도록하는 것이 좋습니다. 이는 버그와 좌절의 일반적인 원인입니다.

+0

감사합니다. 원래 XmlReader를 사용했으며 코드가 명확하지 않아 오류를 제대로 처리하지 못했습니다. 성능은 여기에 큰 문제가 아니며 나는 계속 진행되고있는 일에 대해 머리 글자를 쓰고 싶습니다. –

+0

필자의 예는 clairified라고 언급해야한다. XML 복잡도의 다양한 정도에 대한 약 20 가지 클래스의 시리즈에서이를 수행해야한다. –

+1

IXmlSerializable, IMO를 사용하지 않는 이유가 더 있습니다. 한 번 제대로 얻는 것이 임무입니다. 20 번은 영웅이다. xml 구조를 미러링하는 간단한 DTO 클래스를 사용하고 DTO 클래스와 개체 모델을 일반 C#으로 변환하면됩니다. –

관련 문제