3

我已经很久没有使用 XML 并且需要从 XML 响应中提取有用的信息。如果有 2 个标签相同但名称不同,例如

    <lst name = "stack">
       <str>Ola</str>
       <lst name = "overflow">
          <str>Hello</str>
       </lst>
     </lst>

如何提取带有 name="overflow" 的标签的内容?

4

6 回答 6

5

您可以使用 LINQ To XML:

var result = XDocument.Parse(xml)
                .Descendants("lst")
                .Where(e => (string) e.Attribute("name") == "overflow")
                .Descendants("str")
                .Select(x => x.Value)
                .FirstOrDefault();
于 2013-08-27T10:05:41.600 回答
2

试试这个开始:

XPathDocument docNav = new XPathDocument(pathName);
XPathNavigator nav = docNav.CreateNavigator();
XmlNamespaceManager ns = new XmlNamespaceManager(nav.NameTable);

string val =  nav.SelectSingleNode(@"/lst/lst[@name='overflow']/str")

这些是简单 XPath 导航和 .NET XML 解析的好资源:

http://www.w3schools.com/xpath/

http://www.codeproject.com/Articles/52079/Using-XPathNavigator-in-C

于 2013-08-27T10:02:57.980 回答
2

您可以使用System.Xml.Linq命名空间:

var xDoc = XDocument.Parse(xml);
var result = xDoc.Descendants()
    .Where(d => 
        d.Name == "lst" && 
        d.Attributes("name").FirstOrDefault()!=null &&
        d.Attributes("name").FirstOrDefault().Value == "overflow")
    .FirstOrDefault();
于 2013-08-27T10:07:08.247 回答
0

用户 Linq 到 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
            };
于 2013-08-27T10:04:47.847 回答
0

您可以使用 LINQ to XML 来做到这一点:

var doc = XDocument.Load("YourXMLPath.xml");
var content = doc
.Element("lst")
.Elements("lst")
.Where(e=>((string) e.Attribute("name") ?? "")=="overflow")
.Select(e=>e.Element("str").InnerText())
.FirstOrDefault();
于 2013-08-27T10:05:34.703 回答
0

命名空间中的 LINQ to XML System.Xml.Linq

const string xml = @"<lst name = ""stack""><str>Ola</str><lst name = ""overflow""><str>Hello</str></lst></lst>";

XDocument doc = XDocument.Parse(xml);

IEnumerable<XElement> overflow = doc.Root.Elements("lst").Where(x => (string) x.Attribute("name") == "overflow");

XElement firstOverflow = overflow.FirstOrDefault();

string value = firstOverflow.Descendants("str").FirstOrDefault(x => x.Value);
于 2013-08-27T10:09:31.040 回答