2012-07-19 1 views
2

임의의 일반 텍스트와 올바른 형식의 XML 요소의 세그먼트가 포함 된 텍스트 스트림이 있습니다. 어떻게 그것을 읽고 xml 요소 만 추출 할 수 있습니까? ConformanceLevel이 Fragment로 설정된 XmlReader는 형식이 잘못된 xml 인 일반 텍스트를 만날 때도 예외를 throw합니다.XML과 일반 텍스트가 혼합 된 스트림에서 읽기

아이디어가 있으십니까? 감사합니다

여기에 지금까지 내 코드입니다 : 여기

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ConformanceLevel = ConformanceLevel.Fragment; 

using (XmlReader reader = XmlReader.Create(stream, settings)) 
    while (!reader.EOF) 
    { 
     reader.MoveToContent(); 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(reader.ReadSubtree()); 
     reader.ReadEndElement(); 
    } 

는 샘플 스트림의 내용이고 내가 곧 길이하여 여부를 제어 할 수 없습니다 :

Found two objects: 
Object a 
<object> 
    <name>a</name> 
    <description></description> 
</object> 
Object b 
<object> 
    <name>b</name> 
    <description></description> 
</object> 
+3

일반 텍스트가있는 경우 XML이 아닙니다. Xml로 구문 분석하지 마십시오. 소스의 형식이 더 정확하게 설명 할 수 있습니까? 그리고 아마도 HtmlAgilityPack이 당신을 도울 수 있습니다, 그것은 노드와 일반 텍스트의 혼합 인 Html을 구문 분석 할 수 있습니다. –

+0

나는 그것이 그렇지 않다는 것을 알고있다, 그렇지 않으면 이것은 훨씬 쉬웠을 것이다! 샘플 스트림 컨텐트를 추가했습니다. 여기에서 색상 강조 표시를 끄는 방법을 모릅니다. 죄송합니다. – veezi

+0

구문 강조 표시의 경우,' '(도움말 더 많은 정보를보십시오). 소스 스트림과 관련하여 HtmlAgility 팩을 사용해보십시오. 아니면 평범한 텍스트인지, 무엇이 xml인지 알 수있는 확실한 방법을 알고 있습니까 (예 : 텍스트 1 개, XML 노드 1 개, 텍스트 1 개, XML 노드 1 개, 등). –

답변

1

이 해킹는 경우입니다 제공 혼합 된 문서를 "가짜"xml 루트 노드로 래핑하면 루트 요소의 하위 노드 중에서 요소 요소의 노드 만 가져 오는 것 (즉, 텍스트 노드를 건너 뛰기)이 필요한 작업을 수행 할 수 있어야합니다.

using System; 
using System.Linq; 
using System.Xml; 

static class Program { 

    static void Main(string[] args) { 

     string mixed = @" 
Found two objects: 
Object a 
<object> 
    <name>a</name> 
    <description></description> 
</object> 
Object b 
<object> 
    <name>b</name> 
    <description></description> 
</object> 
"; 
     string xml = "<FOO>" + mixed + "</FOO>"; 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xml); 
     var xmlFragments = from XmlNode node in doc.FirstChild.ChildNodes 
          where node.NodeType == XmlNodeType.Element 
          select node; 
     foreach (var fragment in xmlFragments) { 
      Console.WriteLine(fragment.OuterXml); 
     } 

    } 

} 
+0

환상적! 매력처럼 작동합니다. 고맙습니다. – veezi

+0

다행스럽게도, 비록 내가 약간 다른 입력에 대해 폭발하지 않을 것이라는 것을 인정할 수는 없다. –

관련 문제