Как читать атрибуты XML в C #? - PullRequest
5 голосов
/ 01 ноября 2009

У меня есть несколько файлов XML, из которых я хочу прочитать атрибуты. Моя главная цель - применить подсветку синтаксиса к полному текстовому полю.

Например, в одном из моих документов XML у меня есть: <Keyword name="using">[..] Все файлы имеют один и тот же элемент: Keyword.

Итак, как мне получить значение для атрибута name и поместить их в коллекцию строк для каждого файла XML.

Я использую Visual C # 2008.

Ответы [ 6 ]

4 голосов
/ 01 ноября 2009

Другие ответы сделают эту работу - но синтаксическая подсветка и несколько * XML-файлов , которые вы говорите, заставляют меня думать, что вам нужно что-то быстрее, почему бы не использовать Lean а значит XmlReader?

private string[] getNames(string fileName)
{

  XmlReader xmlReader = XmlReader.Create(fileName);
  List<string> names = new List<string>(); 

  while (xmlReader.Read())
  {
   //keep reading until we see your element
   if (xmlReader.Name.Equals("Keyword") && (xmlReader.NodeType == XmlNodeType.Element))
   {
     // get attribute from the Xml element here
     string name = xmlReader.GetAttribute("name");
     // --> now **add to collection** - or whatever
     names.Add(name);
   }
  }

  return names.ToArray();
}

Другим хорошим вариантом будет класс XPathNavigator, который работает быстрее, чем XmlDoc, и вы можете использовать XPath.

Также я бы предложил использовать этот подход только IFF после того, как вы попробуете простые варианты, вы не довольны производительностью.

3 голосов
/ 01 ноября 2009

Как и другие, я бы предложил использовать LINQ to XML - но я не думаю, что здесь есть необходимость использовать XPath. Вот простой способ вернуть все имена ключевых слов в файле:

static IEnumerable<string> GetKeywordNames(string file)
{
    return XDocument.Load(file)
                    .Descendants("Keyword")
                    .Attributes("name")
                    .Select(attr => attr.Value);
}

Красиво и декларативно :) 1004 *

Обратите внимание, что если вы хотите использовать результат более одного раза, вы должны вызвать ToList() или ToArray(), иначе он будет каждый раз перезагружать файл. Конечно, вы можете изменить метод, чтобы он возвращал List<string> or string[], добавив соответствующий вызов в конец цепочки вызовов метода, например,

static List<string> GetKeywordNames(string file)
{
    return XDocument.Load(file)
                    .Descendants("Keyword")
                    .Attributes("name")
                    .Select(attr => attr.Value)
                    .ToList();
}

Также обратите внимание, что этот просто дает вам имена - я бы ожидал, что вы захотите узнать другие детали об элементах, и в этом случае вы, вероятно, захотите что-то немного другое. Если окажется, что вам нужно больше, пожалуйста, дайте нам знать.

3 голосов
/ 01 ноября 2009

Вы можете использовать XPath для получения всех элементов, а затем запрос LINQ для получения значений для всех найденных атрибутов имени:

 XDocument doc = yourDocument;
 var nodes = from element in doc.XPathSelectElements("//Keyword")
             let att = element.Attribute("name")
             where att != null
             select att.Value;
 string[] names = nodes.ToArray();

Выражение // Keyword XPath означает «все элементы в документе с именем« Keyword ».

Редактировать : только что увидел, что вам нужны только элементы с именем Keyword. Обновлен пример кода.

0 голосов
/ 26 октября 2012
**<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>**



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

                    }
                }

    }
0 голосов
/ 01 ноября 2009

Возможно, вы захотите использовать XPath. //Keyword/@name должен получить все имена ключевых слов.

Вот хорошее введение: .Net и XML XPath-запросы

0 голосов
/ 01 ноября 2009

Вы можете использовать LINQ to XML.

Пример:

var xmlFile = XDocument.Load(someFile);
var query = from item in xmlFile.Descendants("childobject")
            where !String.IsNullOrEmpty(item.Attribute("using")
            select new 
            {
                AttributeValue = item.Attribute("using").Value
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...