문제

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

입력 스트림에서 데이터가 읽히면 XML 스트림이 구축되고 입력 스트림에서 읽은 데이터가 폐기되도록 방법이 있어야합니다. 또한 XML 스트림이 완전히 구축되지 않도록 건축하고 싶습니다. 대신 XML 스트림을 구축 할 때 읽을 수 있습니다. 누구든지 코드 샘플이나 이것에 대해 배울 수있는 좋은 리소스가 있습니까?

도움이 되었습니까?

해결책

스트림으로 XML을 작성하려면 사용하십시오. xmltextwriter.

당신은 그것을 쓸 개울을 줄 수 있습니다. 이것은 당신이 원하는 것을 제공하고 (스트림 출력) 많은 유연성을 제공합니다. 스트림을 코드에 인수로 전달함으로써 메모리 스트림이나 파일 스트림 또는 XML 서식 코드가 없어야 할 필요가없는 모든 것을 연결할 수 있습니다. XMLTextWriter는 주기적으로 데이터를 플러시 할 것입니다 (따라서 스트림에서 읽지 않으면 아무것도 읽지 않으면 주변에 붙어 있지 않음). 마지막으로 최종 플러시/닫기를 기억하십시오.

스트림은 또한 입력을 처리하는 방법입니다. 입력을 처리하고 작성할 XML 요소를 작성하고 결정할 수있는 XMLTextWriter를 사용하여 작성하면 해당 데이터를 읽을 사람에게 해당 데이터를 스트리밍해야합니다. 그래서 당신은 약간 읽고, 약간의 처리를하고, xmltextwriter에게 한 번에 글을 쓰는 루프 (또는 루프)로 끝납니다.

다른 팁

xmltextreader는 메모리 문서 개체 모델 (Dom)의 오버 헤드없이 XML에 원시 데이터에 액세스 해야하는 경우 사용됩니다.

XMLTEXTREADER는 XML을 읽는 더 빠른 메커니즘을 제공합니다. 다음 코드는 스트림에서 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;
    }
}


}

xmlreader.create 메소드를 사용하여 xmlreaderobject instace를 생성 할 수 있습니다. XMLREADERSETTINGS를 사용하여 XML 설정 (XSD, 무지 등)을 지정하십시오.

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

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

.NET 3.5를 사용하는 경우 Xlinq를 사용할 수 있습니다. 이것은 예입니다 http://blogs.msdn.com/wriju/archive/2007/02/20/xlinq-create-xml-from-object-using-linq.aspx

Google을 사용하는 경우 "Xlinq Create" 당신은 많은 예를 찾을 것입니다 (당신은 아마도 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);

출력은 다음과 같습니다.

<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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top