2011-08-26 4 views
1

입력 문자열의 일부로 수정할 수 없습니다. 공유 메모리를 통해 항상 이러한 방식으로 제공되지만, 물론 문자열에 넣은 후에 수정할 수 있습니다. :XML 구문 분석기, 다중 루트

 String.Concat(
      XElement.Parse(encoding.GetString(bytes)) 
       .Descendants("value") 
       .Select(v => v.Value)); 

과 :

<sys><id>SCPUCLK</id><label>CPU Clock</label><value>2930</value></sys><sys><id>SCPUMUL</id><label>CPU Multiplier</label><value>11.0</value></sys><sys><id>SCPUFSB</id><label>CPU FSB</label><value>266</value></sys> 

나는 모두를 읽은

XmlDocument document = new XmlDocument(); 
    document.LoadXml(encoding.GetString(bytes)); 
    XmlNode node = document.DocumentElement.SelectSingleNode("//value"); 
    Console.WriteLine("node = " + node); 

을하지만 그들은 모두 실행에 오류가있다; 입력에 여러 개의 루트가 있습니다 (루트 요소가 여러 개 인용되어 있음). 문자열을 분할하지 않아도됩니다.

문자열을 읽는 방법은 <value></value> 사이의 값을 여러 입력에 넣지 않고 입력 할 수 있습니까?

+2

그러나 XML 문서에는 하나의 루트 만 가질 수 있습니다. 그렇지 않으면 문서의 루트라고 불리지 않습니다. –

답변

5

그것을 처리 할 수 ​​없게됩니다.

예외는 XmlReader입니다. MSDN에서 XmlReaderSettings.ConformanceLevel을 찾아보십시오. ConformanceLevel.Fragment으로 설정하면 해당 설정으로 XmlReader을 만들고이를 사용하여 최상위 요소가없는 스트림에서 요소를 읽을 수 있습니다.

XmlReader.Read()을 사용하는 코드를 작성해야합니다. XmlDocument (하나의 최상위 요소가 있어야 함)에 피드를 제공 할 수 없습니다. 예를 들어,

,

var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }; 
using (var reader = XmlReader.Create(stream, readerSettings)) 
{ 
    while (reader.Read()) 
    { 
     using (var fragmentReader = reader.ReadSubtree()) 
     { 
      if (fragmentReader.Read()) 
      { 
       var fragment = XNode.ReadFrom(fragmentReader) as XElement; 

       // do something with fragment 
      } 
     } 
    } 
} 
+1

괜찮 으면, 적용 할 수있는 방법을 보여주기위한 예제를 추가했습니다. –

+0

나는 전혀 마음을 didnt한다! 고맙습니다! 나는 다소 그것이 일하는 것을 마침내 알아 들었다! 이제 CMD에 http : // pastebin 형식의 xml을 인쇄합니다.com/z9DbSFUm (코멘트에서 작동하는 포맷을 얻을 수 없었습니다.) 이제는 값 노드를 선택하고 CMD 또는 문자열 등을 인쇄하여 내 목표 감사에 훨씬 가까이 가야합니다. – Csharpz

2

XML 요소에는 원하는 자식 구조가있는 하나의 루트 요소가 있어야합니다. 유효한 버전이 될 것

<sys> 
    ... 
</sys> 
<sys> 
    ... 
</sys> 

: 귀하의 XML 문자열처럼 보이는

<someRootElement> 
    <sys> 
    ... 
    </sys> 
    <sys> 
    ... 
    </sys> 
</someElement> 

보십시오 : 대부분의 XML 도구 원 있도록 잘 구성된 XML 문서 아니다

XmlDocument document = new XmlDocument(); 
document.LoadXml("<root>"+encoding.GetString(bytes)+"</root>"); 
XmlNode node = document.DocumentElement.SelectSingleNode("//value"); 
Console.WriteLine("node = " + node); 
+0

제대로 작동하지 않아 잘못된 문자가 나타납니다. " 그것이 달릴 때. 이없는 문자열의 전체 길이는 3388 (hdd의 hdd에있는 인쇄물로 인쇄 됨)이므로 13을 추가하고 3401을 얻습니다 (루트 태그의 길이가 얼마 남았므로). 전체 코드 : http : // pastebin. com/9jvwP73e 무엇을 참조하는 코드에 있으므로 링크가 표시되지 않을 수 있습니다. – Csharpz

+0

XmlElement node = document.SelectSingleNode ("/ Input/txt1") as XmlElement; 나를 위해 더 잘 작동하지만 모든 도움을 주셔서 감사합니다 – Csharpz

0

이 솔루션을 성공적으로 텍스트 노드를 포함한 모든 노드 유형을 구문 분석 :이 노드가 아니기 때문에

var settings = new XmlReaderSettings{ConformanceLevel = ConformanceLevel.Fragment}; 
var reader = XmlReader.Create(stream, settings); 
while(reader.Read()) 
{ 
    while(reader.NodeType != XmlNodeType.None) 
    { 
     if(reader.NodeType == XmlNodeType.XmlDeclaration) 
     { 
      reader.Skip(); 
      continue; 
     } 
     XNode node = XNode.ReadFrom(reader); 
    } 
} 

는 XML 선언을 건너 뜁니다.