2009-03-07 4 views

답변

35

테이크의 장점은 XmlReader 지원 :

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader; 
int lineNumber = xmlInfo.LineNumber; 
+2

나쁜 습관으로 보입니다. XmlReader는 IXmlLineInfo를 상속하지 않으므로이 추상 클래스의 구현은 인터페이스를 구현하지 못할 수 있습니다. 인터페이스 지원에 대한 점검이 필요합니다. – SerG

+1

IXmlLineInfo xmlInfo = reader를 IXmlLineInfo로 사용하십시오. 이 좋은 코드 연습. @shuvra – Shuvra

1

IXmlLineInfo 인터페이스 확장이 설명서에 아주 나쁜; 몇 가지 파기에서부터 다음과 같이 말할 수 있습니다.

1) System.Xml.XmlReader은 추상적이므로이 인스턴스를 절대 다루지 않을 것입니다. 그렇기 때문에 구현하지 않습니다. IXmlLineInfo이 다량으로 System.Xml.IXmlLineInfo 인터페이스는 두 가지 속성을 제공합니다)

이 (가 그랬다면,하지만, 그것은 단지 조금 더 쉽게 : 모든 것을 할 것)와 관련된되지 않습니다 LineNumberLinePosition (우리가 관심사가있는) , 더하기 메서드 : HasLineInfo(), 설명서에 따르면, 구현자가 lineinfo를 반환 할 수 있는지 알려줍니다. System.Xml.XmlReader의 문서화 상속자의

3), 우리는이 :

System.Xml.XmlDictionaryReader - abstract, used by WCF for serialization, no IXmlLineInfo 
System.Xml.XmlNodeReader - used when reading a node, no IXmlLineInfo 
System.Xml.XmlTextReader - used when reading a stream of data, has IXmlLineInfo 
System.Xml.XmlValidatingReader - used when reading a stream of data and validating, has IXmlLineInfo. 

위 목록을 보면, XmlDictionaryReader가 내부적으로 사용하는 것입니다, 당신이 경과 한 때 XmlNodeReader를 사용할 것입니다 읽혀질 노드 (이미 파싱되었지만 이미 소스 문서에서 묶여 있음), XmlTextReaderXmlValidtingReader (둘 다 IXmlLineInfo을 구현 함)은 문서를 읽을 때 사용됩니다. 따라서 길고 짧은 정보는 위치 정보를 제공하는 것이 가능하거나 유용 할 경우 프레임 워크가 그렇게하는 것으로 보입니다.

즉, 설명서는 매우 가벼운 것 같습니다. 그냥이 일을하는 데, 나는 (_xr 알 수없는 콘크리트 System.Xml.XmlReader의 구현 인 상태) 일을 결국 : 나는 실제로 위의 코드를 실행하면 말하게되면서, 그 모두와 함께

string position = "(unknown)"; 
    if (_xr != null && typeof(System.Xml.IXmlLineInfo).IsInstanceOfType(_xr) && 
((System.Xml.IXmlLineInfo)_xr).HasLineInfo()) 
    { 
     System.Xml.IXmlLineInfo li = (System.Xml.IXmlLineInfo)_xr; 
     position = "(" + li.LineNumber.ToString() + "," + li.LinePosition.ToString() + ")"; 
    } 

, _xr의 유형이 될 수있을 테니까요 System.Xml.XsdValidatingReader (행운을 빌어 그 문서를 찾으십시오!)은 System.Xml.XmlReader에서 상속되지만 System.Xml.XmlValidatingReader 또는 System.Xml.XmlTextReader을 상속하지 않습니다. 따라서 위와 같은 방법을 사용하는 것이 좋습니다.