2009-09-28 8 views
6

잘 구성된 xml이 포함 된 문자열이 있습니다. 그 문자열에있는 XML을 탐색하여 특정 노드에서 텍스트를 추출하려고합니다. 내장 .NET 클래스를 사용하여 어떻게 효과적으로 수행 할 수 있습니까? 어떤 .NET XML 클래스를 사용할 것이며 그 이유는 무엇입니까?탐색을 위해 잘 구성된 XML이 포함 된 문자열에서 XML 문서를 효율적으로 구성하는 방법은 무엇입니까?

많은 도움에 감사드립니다.

참고 1 : Linq는 사용할 수 없습니다. 주 2 : XML 편집은 중요하지 않습니다. 읽기 전용 액세스가 필요합니다.

답변

10

는 사용 XmlReader :

using (StringReader sr = new StringReader(myString)) 
using (XmlReader xr = XmlReader.Create(sr)) 
{ 
    while (xr.Read()) 
    { 
     if (xr.NodeType == XmlNodeType.Element && xr.Name == "foo") 
     { 
      Console.WriteLine(xr.ReadString()); 
     } 
    } 
} 

XML 문서에서 "foo에"라는 이름의 모든 요소의 텍스트 내용 밖으로 위의 인쇄합니다. 당신이 그것을 검색 할 수 있습니다 전에 전체 문서를 구문 분석됩니다 때문에, XPathDocument를 사용

가 느립니다 (.. 음, 종류의 ReadString은 매우 우아하게 중첩 된 요소를 처리하지 않습니다)하지만 단순의 장점이있다 :

using (StringReader sr = new StringReader(myString)) 
{ 
    XPathDocument d = new XPathDocument(sr); 
    foreach (XPathNavigator n in d.CreateNavigator().Select("//foo/text()")) 
    { 
     Console.WriteLine(n.Value); 
    } 
} 

당신은 성능이나 메모리 사용에 관심을하지 않는 경우, 그것이 XmlDocument 사용하는 간단한입니다 : 좋은 생각처럼

XmlDocument d = new XmlDocument(); 
d.LoadXml(myString); 
foreach (XmlNode n in d.SelectNodes("//foo/text()")) 
{ 
    Console.WriteLine(n.Value); 
} 
+1

코드 샘플에 대한 좋은 답변입니다. 부수적으로,'XPathNodeIterator'는'IEnumerable'을 구현하므로'while'을 사용할 필요가 없습니다 - foreach가 트릭을 수행하고 읽기 쉽습니다. –

+0

맞습니다. 나는이를 보여주기 위해 예를 편집했다. –

3

XmlDocument.Load()을 사용하여 문자열에서 DOM을 가져옵니다. 그런 다음 필요에 따라 적절한 DOM 메소드 또는 XPATH를 사용하여이를 트래버스 할 수 있습니다.

3

이것은 XML의 구조에 따라 다릅니다. 비교적 간단한 경우 문자열을 StringReader에 랩핑 한 다음 XmlReader에 랩핑하는 가장 효율적인 방법입니다. 이점은 문자열에서 데이터를 복사하는 XML 트리를 메모리에 만들지 않아도된다는 것입니다. 노드를 하나씩 읽는 것입니다.

문서 구조가 충분히 복잡하다면 DOM을 필요로 할 수도 있습니다 (이 경우에는 XDocument.Parse이 트릭을해야합니다).

+0

사운드를하지만 난 Linq에 액세스 할 수 없습니다. – Newbie

+0

StringReader 안에 배치하는 것이 요점을 보지 못합니다. 지금까지 내가 아는 한, StringReader의 유일한 목적은 많은 문자열 연산이 수행 될 때와 같이 가변 문자열을 갖는 것입니다. StringReader를 사용하여 모든 문자열 조작에 대해 새 문자열을 만드는 오버 헤드가 없어졌습니다. 나는 그것이 여기에 어떻게 맞는지 보지 못하니? – Henri

+1

@Henry :'StringWriter'와'StringReader'를 혼동하고 있습니다. 'XmlReader.Create'는'TextReader'를 기대하기 때문에'StringReader'는 평범한 문자열 위에'TextReader' 인터페이스를 제공하기 위해 여기에 사용됩니다. –

7

탐색 기능을 원하십니까? 아마 XPathDocument : MSDN에서

string s = @"<xml/>"; 
XPathDocument doc = new XPathDocument(new StringReader(s)); 

,

는 XPath 데이터 모델을 사용하여 XML 문서의 빠른 읽기 전용 메모리 표현을 제공합니다.

XmlDocument 등과 달리 읽기 전용으로 최적화되어 있습니다. 더 효율적이지만 덜 강력합니다 (예 : 편집 할 수 없음). 쿼리 방법에 대한 참고 사항은 see here입니다.

속도에 대한
+2

'XPathDocument'는 어떤 종류의 XPath 쿼리에서 실제로 훨씬 빠릅니다. 특히 '선행'또는 '선행 형제'축을 포함하는 모든 것. –

+0

이 예제에서 만든 StringReader에 Dispose()를 호출하지 않았 음을 알아 두십시오. Robert Rossney의 대답을 참조하십시오. – ALEXintlsos

+0

@ALEXintlsos는 나를 잘못 이해하지 않습니다. 일반적으로 나는 'IDisposable'에 대해 매우 유창합니다. 그러나 :'StringReader'는 단지 * 정말, 정말로 * 중요하지 않은 경우 중 하나입니다. 그것을 처분하는 것이 더 정확한가? 확실한. * 어떤 방식 으로든 * 중요 할 것인가? 아니, p –

관련 문제