2009-02-10 4 views
1

스트림 객체가 있고, 입력 스트림의 데이터를 기반으로 일종의 XML 스트림을 사용하여 XML을 만들고 출력하고 싶습니다. 나는 하천에서 많은 일을하지 않았으므로 이것을 가능한 한 효율적으로하는 법을 배우려고 노력하고 있습니다. 아이디어는 메모리에 전체 입력 스트림을로드 한 다음 메모리에 전체 출력 스트림을 생성하고 싶지 않기 때문에 어느 시점에서 메모리를 차지하는 입력 스트림의 크기가 최소 두 배가되기 때문입니다.스트림 (.net)에 대한 도움말

입력 스트림에서 데이터를 읽을 때 xml 스트림이 작성되고 입력 스트림에서 읽은 데이터가 삭제되도록하는 방법이 있어야합니다. 또한 XML 스트림이 완전히 빌드되지 않고 전달 된 것이 아니라 대신 XML 스트림이 빌드 될 때 읽을 수 있도록 아키텍처를 구성하려고합니다. 누구나 이것에 대해 배울 수있는 코드 샘플이나 좋은 자료가 있습니까? 당신이 메모리 문서 객체 모델 (DOM)

하여 XmlTextReader는 XML을 빠르게 읽을 수있는 메커니즘을 제공에서의 오버 헤드없이 XML을 원시 데이터로 액세스해야하는 경우

답변

1

스트림로 XML을 작성하는 경우, XmlTextWriter를 사용합니다.

쓸 스트림을 지정할 수 있습니다. 이렇게하면 원하는 것을 얻을 수 있으며 (스트림 출력) 많은 유연성을 제공합니다. 스트림을 인수로 사용하여 코드에 전달하면 메모리 스트림이나 파일 스트림 또는 XML 형식 코드가 필요하지 않은 모든 것을 연결할 수 있습니다. XmlTextWriter는 주기적으로 데이터를 플러시합니다 (스트림에서 아무것도 읽지 않으면 막대기가 생기지 않습니다). 마지막에 마지막 플러시/닫기를 수행하는 것을 잊지 마십시오.

스트림도 입력을 처리하는 방법입니다. 해당 입력을 처리하고 작성할 XML 요소를 결정할 때 XmlTextWriter를 사용하여 XML 요소를 작성하면 해당 데이터를 누구에게나 스트리밍 할 수 있습니다. 따라서 약간의 독서를하고있는 루프 (또는 루프)로 끝나고 처리를 한 다음 XmlTextWriter에 한 번에 쓰는 것입니다.

+0

앞으로 사용할 수있는 스트림이 있습니까? 메모리 스트림은 탐색 가능하기 때문에, 읽었을 때도 메모리를 채울 것입니다. 스트림을 읽을 때 스트림에서 데이터를 제거하는 것이 있습니까? – Jeremy

+0

FileStream 및 FileMode.Append 및 FileAccess.Write를 사용하여 파일에 쓸 수 있습니다. 아니면 System.IO.Pipes.PipeStream (.NET 3.5)이 도움이 될 것입니다. 전에 .NET 파이프를 사용하지 않았기 때문에 경험에서 말할 수 없습니다. 하지만 Java 스트림을 사용했습니다. – JasonMArcher

2

XmlTextReader가 사용됩니다. 다음 코드는 스트림에서 XmlTextReader를로드합니다.

using (XmlTextReader reader= new XmlTextReader (stream)) { 

while (reader.Read()) 
{ 
    switch (reader.NodeType) 
    { 
     case XmlNodeType.Element: // The node is an Element. 
      Console.Write("<" + reader.Name); 
    Console.WriteLine(">"); 
      break; 
    case XmlNodeType.Text: //Display the text in each element. 
      Console.WriteLine (reader.Value); 
      break; 
    case XmlNodeType. EndElement: //Display end of element. 
      Console.Write("</" + reader.Name); 
    Console.WriteLine(">"); 
      break; 
    } 
} 


} 
+0

내가 입력 스트림은 XML 모르겠어요은 다른 데이터를 XML로 변환되고있어 많은 것 같은데 –

+0

@Joel는, 그래 그것은 구문 분석 및 구축 XML을 기반으로 가져옵니다 TCP 스트림에서입니다.. 그 데이터. – Jeremy

0

XmlReader.Create 메서드를 사용하여 XmlReaderObject 인스턴스를 만들 수 있습니다. XML 설정 지정 XmlReaderSettings를 사용 (XSD, IgnoreComments, 등.)

 XmlReaderSettings settings = new XmlReaderSettings(){ 
     settings.IgnoreComments = true; 
     using (XmlReader reader = XmlReader.Create("Test.xml",settings)){ 
      while(reader.Read()){ 

       // Construct/Evaluate XML Here.... 
      } 
      reader.Close(); 
     } 
    } 
0

.net 3.5를 사용하는 경우 XLINQ를 사용할 수 있습니다. 이것은 당신이 (당신은 아마 내가 생각하고는 RSS 예에서 가장 관심이있을 것입니다.

var objCust = new[] 
{ 
new {CustID = 2, CustName = "Sumitra", Phone = "123-123-1236"}, 
new {CustID = 3, CustName = "Wriju", Phone = "123-123-1235"}, 
new {CustID = 4, CustName = "Writam", Phone = "123-123-1234"}, 
new {CustID = 1, CustName = "Debajyoti", Phone = "123-123-1237"} 
}; 
XElement _customers = new XElement("customers", 
         from c in objCust 
         orderby c.CustID //descending 
         select new XElement("customer", 
          new XElement("name", c.CustName), 
          new XAttribute("ID", c.CustID), 
          new XElement("phone", c.Phone) 
              ) 
            ); 
Console.WriteLine(_customers); 

출력은 다음과 같이 표시됩니다 많은 예를 찾을 수 당신이 "xlinq create"에 구글을 경우 http://blogs.msdn.com/wriju/archive/2007/02/20/xlinq-create-xml-from-object-using-linq.aspx

의 예입니다 :.

<customers> 
    <customer ID="1"> 
    <name>Debajyoti</name> 
    <phone>123-123-1237</phone> 
    </customer> 
    <customer ID="2"> 
    <name>Sumitra</name> 
    <phone>123-123-1236</phone> 
    </customer> 
    <customer ID="3"> 
    <name>Wriju</name> 
    <phone>123-123-1235</phone> 
    </customer> 
    <customer ID="4"> 
    <name>Writam</name> 
    <phone>123-123-1234</phone> 
    </customer> 
</customers> 
관련 문제