2009-08-11 5 views
1

에 내가 여기에 XML로 노래의 세부 사항을 저장하는 프로그램을 writting하고 나의 코드추가] 큰 XML

  private XmlDocument mediaXmlDoc = new XmlDocument(); 
      private XmlNode rootNode; 

      mediaXmlDoc.RemoveAll(); 

      rootNode = mediaXmlDoc.CreateElement("filelist"); 
      mediaXmlDoc.AppendChild(rootNode); 

되며, 각 노래에 대해 내가 좋아하는 세부 사항을 추가하고

  XmlNode file = mediaXmlDoc.CreateElement("file");     

      XmlNode filename = mediaXmlDoc.CreateElement("filename"); 
      filename.InnerText = FileName; 
      file.AppendChild(filename); 

      XmlNode path = mediaXmlDoc.CreateElement("path"); 
      path.InnerText = Path; 
      file.AppendChild(path); 

      XmlNode ext = mediaXmlDoc.CreateElement("ext"); 
      ext.InnerText = Ext; 
      file.AppendChild(ext); 

      XmlNode artist_name = mediaXmlDoc.CreateElement("artist_name"); 
      artist_name.InnerText = ArtistNameString; 
      file.AppendChild(artist_name); 

      XmlNode song_title = mediaXmlDoc.CreateElement("song_title"); 
      song_title.InnerText = SongTitleString; 
      file.AppendChild(song_title); 

      XmlNode genre = mediaXmlDoc.CreateElement("genre"); 
      genre.InnerText = GenreString; 
      file.AppendChild(genre); 

      XmlNode comments = mediaXmlDoc.CreateElement("comments"); 
      comments.InnerText = CommentsString; 
      file.AppendChild(comments); 

      XmlNode album_name = mediaXmlDoc.CreateElement("album_name"); 
      album_name.InnerText = AlbumNameString; 
      file.AppendChild(album_name); 

      XmlNode year = mediaXmlDoc.CreateElement("year"); 
      year.InnerText = YearString; 
      file.AppendChild(year); 

      XmlNode track_number = mediaXmlDoc.CreateElement("track_number"); 
      track_number.InnerText = TrackNumberString; 
      file.AppendChild(track_number); 

      XmlNode duration = mediaXmlDoc.CreateElement("duration"); 
      duration.InnerText = DurationString; 
      file.AppendChild(duration); 

      XmlNode bit_rate = mediaXmlDoc.CreateElement("bit_rate"); 
      bit_rate.InnerText = BitRateString; 
      file.AppendChild(bit_rate); 

      XmlNode protected_media = mediaXmlDoc.CreateElement("protected"); 
      protected_media.InnerText = ProtectedString; 
      file.AppendChild(protected_media); 

      XmlNode sample_rate = mediaXmlDoc.CreateElement("sample_rate"); 
      sample_rate.InnerText = SampleRateString; 
      file.AppendChild(sample_rate); 

      XmlNode channels = mediaXmlDoc.CreateElement("channels"); 
      channels.InnerText = ChannelsString; 
      file.AppendChild(channels); 

      rootNode.AppendChild(file); 

이하 내 문제는 xml의 크기가 증가함에 따라 추가 속도가 느려지므로 성능 문제를 해결하기 위해 무엇을 할 수 있는지 느낀다.

감사합니다.

답변

7

실제로는 XmlWriter 클래스를 사용해야합니다. XmlDocument는 메모리에있는 모든 XML을로드하고 거대한 파일로 작업이 매우 느려질 수 있습니다.

이 클래스 사용 방법은 this example tutorial을 참조하십시오.

대신을 XmlDocument에 비해
2

사용 XmlWriter를, 그것은 큰 파일

1
void TraverseNode(string path) 
    { 
     XmlDocument xmlDocument = new XmlDocument(); 
     xmlDocument.Load(new StreamReader(path, System.Text.Encoding.UTF8)); 
     XmlNodeList _nodeList = xmlDocument.SelectNodes("//session"); 
     string strxml = ""; 
     string completexml = ""; 
     for (int inode = 0; inode < _nodeList.Count; inode++) 
     { 
      if(inode==0) 
       strxml = formatxml(_nodeList[inode].OuterXml).ChildNodes[0].ChildNodes[0].OuterXml; 
      else 
       strxml = formatxml("<session>" + _nodeList[inode].OuterXml + "</session>").ChildNodes[0].ChildNodes[0].OuterXml; 

      completexml += strxml; 
      strxml = ""; 

     } 
     XmlDocument newxml = new XmlDocument(); 
     newxml.LoadXml("<session>" + completexml + "</session>"); 
     newxml.Save(@"C:\Working\Teradata\ssis\out_18.xml"); 
    } 


    XmlDocument formatxml(string xml) 
    { 
     XmlDocument xmlDocument = new XmlDocument(); 
     xmlDocument.LoadXml(xml); 
     XmlNode nodeListOtherInterest = xmlDocument.SelectSingleNode("//session/data/account/additionalOtherInterest/address"); 
     XmlNode acAddress = xmlDocument.SelectSingleNode("//session/data/account/address"); 
     XmlNode locationaddress = xmlDocument.SelectSingleNode("//session/data/account/location/address"); 
     XmlNode lineaddress = xmlDocument.SelectSingleNode("//session/data/policy/line/address"); 
     string strotherinterest = ""; 
     string stracAddress = ""; 
     string strlocationaddress = ""; 
     string strlineaddress = ""; 
     string straddressess=""; 

     XmlNodeList statecodes; 
     statecodes = xmlDocument.SelectNodes("//session/data/policy/line/linestate/linestateterm/coverage/statCode"); 

     for (int i = 0; i < statecodes.Count; i++) 
     { 
      if(statecodes[i].InnerText=="0") 
       statecodes[i].ParentNode.RemoveChild(statecodes[i]); 
     } 

     if (xmlDocument.SelectSingleNode("//session/data/account/additionalOtherInterest/address") != null) 
     { 
      strotherinterest = "<address_otherinterest>" + nodeListOtherInterest.InnerXml + "</address_otherinterest>"; 
      nodeListOtherInterest.ParentNode.RemoveChild(nodeListOtherInterest); 
     } 
     if (xmlDocument.SelectSingleNode("//session/data/account/address") != null) 
     { 
      stracAddress = "<address_Account>" + acAddress.InnerXml + "</address_Account>"; 
      acAddress.ParentNode.RemoveChild(acAddress); 
     } 
     if (xmlDocument.SelectSingleNode("//session/data/account/location/address") != null) 
     { 
      strlocationaddress = "<address_location>" + locationaddress.InnerXml + "</address_location>"; 
      locationaddress.ParentNode.RemoveChild(locationaddress); 
     } 
     if (xmlDocument.SelectSingleNode("//session/data/policy/line/address") != null) 
     { 
      strlineaddress = "<address_line>" + lineaddress.InnerXml + "</address_line>"; 
      lineaddress.ParentNode.RemoveChild(lineaddress); 
     } 
     straddressess= "<addressess>"+strotherinterest +stracAddress+strlocationaddress+strlineaddress + "</addressess>"; 
     XmlDocument address = new XmlDocument(); 
     address.LoadXml(straddressess); 
     XPathNavigator pnav = xmlDocument.CreateNavigator(); 
     pnav.MoveToChild("session", ""); 
     pnav.MoveToChild("session",""); 
     pnav.AppendChild(straddressess); 
     return xmlDocument; 
    } 
에 더 적합이다