2009-11-01 100 views
5

我有幾個XML文件,我希望從中讀取屬性。我的主要目標是將語法突出顯示應用於富文本框。如何讀取C#中的XML屬性?

例如,在我的一個XML文檔中,我有:<Keyword name="using">[..]所有文件都具有相同的元素:Keyword

那麼,如何獲取屬性name的值,並將它們置於每個XML文件的字符串集合中。

我使用Visual C#2008

回答

4

其他的答案將做的工作 - 但語法高亮啄幾個XML文件你說你有讓我覺得你需要的東西更快,爲什麼不使用精益並意味着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後,你嘗試了直接的選項,你不滿意的表現。

+0

這正是我需要的,但是......我如何將「無論」作爲一個字符串數組? – 2009-11-01 13:26:00

+0

對於語法高亮顯示,我非常懷疑他會一遍又一遍地讀取文件。顯而易見的解決方法是一次*讀*,這意味着速度遠不如可讀性重要。使用LINQ to XML是這裏的顯而易見的解決方案,IMO。 – 2009-11-01 13:57:26

+0

@JonSkeet我同意 - 事實上,我建議僅考慮這種方法,如果性能變成問題(例如 - 讀取文件一次 - 可能是這種情況,這需要在大量大文件上執行並且啓動/負載性能可能會受到顯着影響) – JohnIdol 2009-11-01 17:00:32

3

您可以使用XPath來獲取所有的元素,那麼LINQ查詢來獲取所有名稱值atttributes你會發現:

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

的/ /關鍵字XPath表達式表示,關鍵詞‘「的文件,命名中的所有元素’

編輯:剛纔看到你只想要一個名爲關鍵字元素更新的代碼示例

+0

如何爲XDocument提供我的XML文檔的值?在Visual C#中,在解決方案資源管理器中,我有一個名爲API的文件夾,裏面是所有的XML文檔,例如:batch.xml。我是否將它實例化爲一個String或什麼? – 2009-11-01 13:10:28

+0

@Mohit:'XDocument doc = XDocument.Load(@「API \ batch.xml」);'應該這樣做 – 2009-11-01 14:39:42

+0

我得到了「解析EntityName時發生錯誤,第1120行,第27位。這是第1120行:位置27介於e和r之間 – 2009-11-04 01:39:18

0

您可以使用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 
      }; 
0

你可能會希望使用XPath。 //Keyword/@name應該爲您提供所有關鍵字名稱。

這裏有一個很好的介紹:.Net and XML XPath Queries

3

與其他人一樣,我會建議使用LINQ to XML - 但我不認爲在這裏需要使用XPath。這裏有一個簡單的方法來在一個文件中返回所有關鍵字名稱:

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

尼斯和聲明:)

請注意,如果你將要使用的結果超過一次,你應該叫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(); 
} 

另外請注意,這只是給你的名字 - 我本來期望你想要的元素的其他細節,在這種情況下,你可能想要的東西略有不同。如果事實證明你需要更多,請告訴我們。

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

        } 
       } 

    }