2009-08-11 59 views
1

我书面方式程序存储的歌曲在这里XML中的细节是我的代码追加到大型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

2

使用的XmlWriter而不是XmlDocument的,它更适合于大型文件

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; 
    }