2016-06-14 3 views
1

Я пытаюсь разделить XML-файл на части У меня есть файл XML, как этотC# Деление XML на части

<?xml version="1.0" encoding="utf-8"?> 
<RegistrationOpenData xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.gov"> 
<Description>Registration data is collected by ABC XYZ</Description> 
<InformationURL>http://www.example.com/html/hpd/property-reg-unit.shtml</InformationURL> 
<SourceAgency>ABC Department of Housing</SourceAgency> 
<SourceSystem>PREMISYS</SourceSystem> 
<StartDate>2016-02-29T00:03:06.642772-05:00</StartDate> 
<EndDate i:nil="true" /> 
<Registrations> 
<Registration xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<RegistrationID>1</RegistrationID> 
<BuildingID>1A</BuildingID> 
<element1>E11</element1> 
<element2>E21</element2> 
<element3>E31</element3> 
<element4>E41</element4> 
</Registration> 
<Registration xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<RegistrationID>2</RegistrationID> 
<BuildingID>2A</BuildingID> 
<element1>E21</element1> 
<element2>E22</element2> 
<element3>E32</element3> 
<element4>E42</element4> 
</Registration> 
</Registrations> 
</RegistrationOpenData> 

И я пытаюсь извлечь число узлов корыта этот код

XmlDocument doc = null; 
doc = new XmlDocument(); 
doc.Load(@"D:\Registrations20160229.xml"); 
XmlNodeReader nodeReader = new XmlNodeReader(doc); 
XmlElement root = doc.DocumentElement; 
XmlNodeList elemList = root.GetElementsByTagName("Registration"); 
int totalnode = elemList.Count; 
int nodehalf = totalnode/2; 
MessageBox.Show(nodehalf.ToString()); 

Но после этого я не могу продолжить. Этот код я использовал для расчета числа регистрационных узлов, а затем сделал их пополам, теперь я не знаю, как продолжить дальше, чтобы разделить этот файл, у меня всего 158718 записи (регистрационные узлы) внутри файла (иногда даже больше), и я пытаясь сломать все на части, возможно, от 3 до 4 частей.

+0

Можете ли вы сказать нам, что фактический симптом является то, что вы видите? Нарушение файла на 3-4 части не требуется. Когда вы говорите «это не удалось из-за размера», можете ли вы подробнее рассказать об этом? Какое сообщение об ошибке вы получили? –

+0

Я попытался загрузить его в массив, а затем запустить «for loop», чтобы получить часть из 30 000 записей, но он не смог загрузить полный файл сразу и показал Out of Memory Exception – Hanumendra

+0

Пожалуйста, покажите код, который не работает. Вы показали нам один блок кода, а затем сказали нам, что блок id_different_ не работает. –

ответ

0

Попробуйте это, не следует загружать весь XML в память

 using(XmlReader reader = XmlReader.Create(new FileStream(@"D:\Registrations20160229.xml" , FileMode.Open))){ 
         while (reader.Read()) 
     { 
      if(reader.NodeType == XmlNodeType.Element && reader.Name == "Registration") 
       counter++; 
     } 
     Console.WriteLine(counter); 
     } 
+0

Расчет количества узлов работает отлично с помощью выше кода, как я могу разделить xml на части? – Hanumendra

+0

Итак, если вы хотите получить узел регистрации внутри, если поместить это: XElement el = (XElement) XNode.ReadFrom (reader) – blackcat

+0

~ Hanumendra проблема здесь в том, что вы решили, что разделение XML на части, чтобы уменьшить его, - это способ вперед для вас. Вероятно, это не так. Пожалуйста, обновите свой вопрос, чтобы включить код, который вы написали, ошибку, которую он дает, * и вашу конечную цель *. Похоже, у нас может возникнуть проблема XY (см. Здесь http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –