2010-03-09 8 views
1

나는 XML 파일은 다음과 같다있다 :효과적으로

id value 
===== 
01, 88 
03, 80 
51, 85 
을 : 파일을 구문 분석하고 다음과 같은 Mask_X1의 모든 데이터를 얻을 수있는 방법

<?xml version="1.0" encoding="utf-8" ?> 
<PathMasks> 
<Mask desc="Masks_X1"> 
    <config id="01" mask="88" /> 
    <config id="03" mask="80" /> 
    <config id="51" mask="85" /> 
    </Mask> 

<Mask desc="Masks_X2"> 
    <config id="70" mask="1" /> 
    <config id="73" mask="6" /> 
    </Mask> 

<Types> 
    <path id="01" desc="TC->PP1" /> 
    <path id="02" desc="TC->PP2" /> 
    <path id="03" desc="TC->PPn" /> 
    </Types> 
    </PathMasks> 

내가 사용하고

.NET Framework는 XML Linq에로에 2.0

답변

1

(읽기/쓰기 속도가 느린, 더 큰 메모리 풋 프린트 작품 같은 방식으로 XML의 DOM의 사방 일) XmlDocument 사용 :

XmlDocument d = new XmlDocument(); 
d.Load(filename); 
string xpath = "/PathMasks/Mask[@desc='Mask_X1']/config" 
foreach (XmlElement elm in d.SelectNodes(xpath)) 
{ 
    Console.WriteLine(elm.GetAttribute("id"), elm.GetAttribute("desc")); 
} 

XPathDocument (더 빨리, 더 작은 메모리 풋 프린트를 사용하여, 읽기 전용, 이상한 API) :

XPathDocument d = new XPathDocument(filename); 
string xpath = "/PathMasks/Mask[@desc='Mask_X1']/config" 
XPathNodeIterator iter = d.CreateNavigator().Select(xpath); 
while (iter.MoveNext()) 
{ 
    Console.WriteLine(iter.Current.GetAttribute("id"), iter.Current.GetAttribute("desc')); 
} 

내가,624를 반환 XPathNavigator하는 방법이없는 이유를 완벽하게 좋은 이유가있을거야그래야 정상적인 사람처럼 XPath 쿼리의 결과를 반복 할 수 있지만 해결하지 못했습니다.

+0

'XPathDocument'는'IEnumerable '보다 선행합니다. 자신의 확장 방법을 자유롭게 작성하여 여기에 게시하십시오. –

+0

요즘 저는 기술이 도입 된 순서대로 도입된다는 사실을 기억할 것입니다. –

0

사용하여 XDocument 및 쿼리입니다

LINQ to XML을 사용
XDocument doc = XDocument.Load("file.xml"); 
var linqtoxml = from node in document.Descendants("Mask") 
    where (string)node.Attribute("desc").Value == "Masks_X1" 
    select node; 
foreach (var mask in linqtoxml) 
{ 
    // pull data out of here into a structure of your choosing 
} 
+0

.NET 2.0을 사용 중입니다. System.Xml 네임 스페이스에 linq이없는 것 같습니다. –

+1

이 경우에는 XmlDocument 및 XPath 쿼리가 거의 사용되지 않습니다. – ZombieSheep

0

:

XDocument doc = XDocument.Load(filename); 
var query = from mask in doc.Root.Elements("Mask") 
      where mask.Attribute("desc").Value == "Masks_X1" 
      from config in mask.Elements("config") 
      select new 
      { 
       id = config.Attribute("id").Value, 
       value = config.Attribute("mask").Value 
      }; 

foreach(var mask in query) 
{ 
    Console.WriteLine("{0}\t{1}", mask.id, mask.value); 
} 
2

는 닷넷 2.0을 작업하면서 당신이 Linq에가되지 않습니다 때문에,이 샘플이 당신을 도움이 XPath를 사용해야합니다.

 XmlDocument doc = new XmlDocument(); 

     doc.Load(pathToXmlDoc); 


     XmlNode node = doc.SelectSingleNode("/PathMasks/Mask[@desc='Masks_X1']"); 

     foreach (XmlNode config in node) 
     { 
      Console.WriteLine("{0}\t{1}", 
          config.Attributes["id"].Value, 
          config.Attributes["mask"].Value); 
     } 
+0

'SelectSingleNode'는 단일 노드 또는 널을 리턴합니다. 결과를 반복 할 수는 없습니다. –

+0

SelectSingleNode를 사용하면 실제로 단일 XmlNode를 반환합니다. 그러나 각 XmlNode에는 자식 노드의 컬렉션이 포함되어 있으므로이 예에서 foreach는 선택한 단일 마스크 노드 아래의 각 자식 노드를 반복합니다. 따라서이 예제에서 SelectSingleNode는 Mask_X1 값을 보유하는 desc 속성을 가진 Mask 노드를 선택할 것입니다. 반환 된 XmlNode의 ChildNodes 속성은 마스크 노드 아래의 각 구성 노드에 대해 3 개의 항목을 보유합니다. 자식 노드를 반복하여 필요한 출력을 생성 할 수 있습니다. –

관련 문제