XMLReader для чтения XML-файла на основе значения атрибута - PullRequest
0 голосов
/ 01 марта 2012

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

    <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>"

Ответы [ 3 ]

2 голосов
/ 26 октября 2012

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

                    }
                }

    }
2 голосов
/ 01 марта 2012

Хорошо, вот несколько заметок для размышления. 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

1 голос
/ 01 марта 2012

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

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

XmlDocument xDoc = new XmlDocument();

xDoc.LoadXml(myXMLString);

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

Тогда делай что хочешь с homeAddress.

Подробнее здесь на w3schools на XPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...