簡體   English   中英

使用C#解析XML字符串

[英]Parse XML string using C#

我需要使用C#解析一個簡單的XML字符串

<items>
    <item1 value="value1" />
    <item2 value="value2" />
    <item3 value="value3" />
    <itme4 value="value4" />
    <item5 value="value5" />
    <itme6 value="value6" />
</items>

我正在努力做到如下:

    XMLParser XMLParserObj = new XMLParser();
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(xmlString);

   string item1 = xmlDoc.Attributes.GetNamedItem("item1").Value;
   string item2 = xmlDoc.Attributes.GetNamedItem("item2").Value;
   string item3 = xmlDoc.Attributes.GetNamedItem("item3").Value;
   string item4 = xmlDoc.Attributes.GetNamedItem("item4").Value;
   string item5 = xmlDoc.Attributes.GetNamedItem("item5").Value;
   string item6 = xmlDoc.Attributes.GetNamedItem("item6").Value;

沒有運氣

請指教..

一個可能的解決方案是使用LINQ2XML

// retrieve a single element by tag name
private XElement getElement(XDocument xmlDocument, string elementName)
{
    var element = xmlDocument.Descendants("items").Elements().Where (x => x.Name == elementName).FirstOrDefault();
    return element != null ? element : null;
}

// retrieve attribute by name
private string attributeValue(XElement item, string attributeName)
{
    var attribute = item.Attribute(attributeName);
    return attribute != null ? attribute.Value : string.Empty;
}

這兩個函數可以像這樣使用:

// input for the example
var input = @"<items>
<item1 value=""value1"" />
<item2 value=""value2"" />
<item3 value=""value3"" />
<itme4 value=""value4"" />
<item5 value=""value5"" />
<item6 value=""value6"" />
</items>";

var xml = XDocument.Parse(input);
var element = getElement(xml, "item2");
if (element != null)
{
    Console.WriteLine(attributeValue(element, "value"));
}

輸出是:

value2

對於像這樣的重復性任務,將方法實現為擴展通常是有利的:

public static class ProjectExtensions
{
    // retrieve a single element by tag name
    public static XElement GetElementByName(this XDocument xmlDocument, string parentElementName, string elementName)
    {
        var element = xmlDocument.Descendants(parentElementName).Elements().Where (x => x.Name == elementName).FirstOrDefault();
        return element != null ? element : null;
    }

    // retrieve attribute by name
    public static string GetAttributeValueByName(this XElement item, string attributeName)
    {
        var attribute = item.Attribute(attributeName);
        return attribute != null ? attribute.Value : string.Empty;
    }
}

IMO的使用更加簡單和清潔:

var xml = XDocument.Parse(input);
var element = xml.GetElementByName("items", "item2");
if (element != null)
{
    Console.WriteLine(element.GetAttributeValueByName("value"));
}

您當然可以(如已經建議的那樣)直接使用XPath。

保留所有代碼相同但更改此內容:

string item1 = xmlDoc.GetElementsByTagName("item1")[0].Attributes[0].Value;

為其他項目做同樣的事情,你將獲得價值。

假設您想要每個item元素的value屬性,您可以使用Xpath:

        string xmlString = "<items><item1 value=\"value1\" /><item2 value=\"value2\" /><item3 value=\"value3\" /><item4 value=\"value4\" /><item5 value=\"value5\" /><item6 value=\"value6\" /></items>";

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xmlString);

        string item1 = xmlDoc.SelectSingleNode("items/item1/@value").InnerText;
        string item2 = xmlDoc.SelectSingleNode("items/item2/@value").InnerText;
        string item3 = xmlDoc.SelectSingleNode("items/item3/@value").InnerText;
        string item4 = xmlDoc.SelectSingleNode("items/item4/@value").InnerText;
        string item5 = xmlDoc.SelectSingleNode("items/item5/@value").InnerText;
        string item6 = xmlDoc.SelectSingleNode("items/item6/@value").InnerText;

你錯過了“屬性”一詞,你試圖捕捉“item1”,它實際上是一個節點。

用這個:

string item1 = xmlDoc.SelectSingleNode("//items/item1").Attributes["value"].value;

還有其他選項,但這會為您提供所需的值。

干杯...

這將獲得所有這些屬性值:

1)如果來自字符串XDocument.Parse(),則使用XDocument.Load()加載xml,然后執行以下操作:

IEnumerable<string> result = from node in xmlDoc.Root.Descendants()
                             select node.Attribute("value").Value;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM