2012-03-01 3 views
0

Я пытаюсь прочитать следующий файл, я могу читать атрибуты, но я не могу перейти к конкретному элементу (в данном случае адресу) и прочитать его элементы на основе атрибута этого элемента (Адрес). Вскоре мне нужно провести различие между рабочими и домашними адресами. Мне нужно сделать это с помощью класса XMLReader. Вы можете помочь?XMLReader чтение XML-файла на основе значения атрибута

<Address Label="Work"> 
     <Name>Name1</Name> 
     <Street>PO 1</Street> 
     <City>City1</City> 
     <State>State 1</State> 
    </Address> 
    <Address Label="Home"> 
     <Name>Name2</Name> 
     <Street>PO 2</Street> 
     <City>City2</City> 
     <State>State 2</State> 
    </Address>" 
+0

Можете ли вы после того, что вы пробовали до сих пор? (Я предполагаю, что вы используете C#) – aweis

ответ

2

Хорошо, вот несколько заметок, о которых нужно подумать. XMLReader в том смысле, что я понимаю, что вы его используете (без примера кода) заключается в том, что вы перебираете документ, поскольку XMLReader доступен только для чтения и доступен только для чтения.

Из-за этого вам нужно выполнить итерацию, пока не найдете нужный вам узел. В приведенном ниже примере я нахожу элемент адреса, помеченный как «работа», и извлекаю весь этот узел. Затем запросите на этом узле, как хотите.

using (var inFile = new FileStream(path, FileMode.Open)) 
{ 
    using (var reader = new XmlTextReader(inFile)) 
    { 
     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: 
        if (reader.Name == "Address" && reader.GetAttribute(0) == "Work") 
        { 
         // Create a document, which will contain the address element as the root 
         var doc = new XmlDocument(); 
         // Create a reader, which only will read the substree <Address> ... until ... </Address> 
         doc.Load(reader.ReadSubtree()); 
         // Use XPath to query the nodes, here the "Name" node 
         var name = doc.SelectSingleNode("//Address/Name"); 
         // Print node name and the inner text of the node 
         Console.WriteLine("Node: {0}, Inner text: {1}", name.Name, name.InnerText); 
        } 
        break; 
      } 
     } 
    } 
} 

Редактировать

Сделано пример, который не использует LINQ

+0

Спасибо, я добрался до адресного узла и выберите тот, у кого есть работа, как мне перейти на имя или значение тега улицы? – Karaman

+0

Привет, я обновил ответ на примере доступа к элементу улицы. – aweis

+0

Спасибо, к сожалению, Linq не является опцией, programmin в .NET CF 2.0, есть ли какой-либо другой sugesstion, который вы можете сделать? Заранее спасибо. – Karaman

1

Использование XPath вы можете легко написать краткие выражения для перемещения документа XML.

Вы бы сделать что-то вроде

XmlDocument xDoc = new XmlDocument(); 

xDoc.LoadXml(myXMLString); 

XmlNode homeAddress = xDoc.SelectSingleNode("//Address[@Label='Work']"); 

Тогда делать все, что вы хотите с homeAddress.

Подробнее here on w3schools на XPath.

+0

Привет, Спасибо за ответ, но я пытаюсь использовать XMLReader для его скорости. – Karaman

+1

И я должен сказать ("// Адрес [@ Label = 'Work']"); очень гладкий! – Karaman

2

XML:

<Countries> 
    <Country name ="ANDORRA"> 
    <state>Andorra (general)</state> 
    <state>Andorra</state> 
    </Country> 
    <Country name ="United Arab Emirates"> 
    <state>Abu Z¸aby</state> 
    <state>Umm al Qaywayn</state> 
    </Country> 

Java:

public void datass(string file) 
    { 

      string file = HttpContext.Current.Server.MapPath("~/App_Data/CS.xml"); 
       XmlDocument doc = new XmlDocument(); 
       if (System.IO.File.Exists(file)) 
       { 
        //Load the XML File 
        doc.Load(file); 

       } 


       //Get the root element 
       XmlElement root = doc.DocumentElement; 
       XmlNodeList subroot = root.SelectNodes("Country"); 

       for (int i = 0; i < subroot.Count; i++)  
       { 

        XmlNode elem = subroot.Item(i); 
        string attrVal = elem.Attributes["name"].Value; 
        Response.Write(attrVal); 
        XmlNodeList sub = elem.SelectNodes("state"); 
        for (int j = 0; j < sub.Count; j++) 
        { 
         XmlNode elem1 = sub.Item(j); 
         Response.Write(elem1.InnerText); 

        } 
       } 

    }