当我找到相关的父节点时获得XML节点的详细信息

本文关键字:XML 节点 详细信息 父节点 | 更新日期: 2023-09-27 18:14:50

我就快到了,但是我需要一些帮助。

这是我用来处理XML文件的代码。我就能找到需要存储的部分;我只是不知道如何保存它。

XmlDocument doc = new XmlDocument();
doc.XmlResolver = null;
doc.Load(@"c:'xml'Sales.xml");
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("nd/ni/nv/noid"); 
foreach (XmlNode node in nodes)
{
    if (node.OuterXml.IndexOf("Server=1,Function=1,Location=") > 0)
    {
        Console.WriteLine(node.OuterXml);
        // This prints out "<noid>Server=1,Function=1,Location=24</noid>"
        // How do I read the four <r> nodes within this <noid>?
        // The values would be [124, 2, 43, 90]
    }
}

xml看起来像这样:

<nd>    
    <ni>
        <nv>
            <noid>Managed=1,Network=1,smtp=1</noid>
            <r>27</r>
            <r>4</r>
        </nv>
        <nv>
            <noid>Managed=1,Network=1,Ibc=1</noid>
            <r>8</r>
            <r>2</r>
        </nv>
        <nv>
            <noid>Server=1,Function=1,Location=24</noid>
            <r>124</r>
            <r>2</r>
            <r>43</r>
            <r>90</r>
        </nv>
        <nv>
            <noid>Unmanaged=9,Label=7,Place=5</noid>
            <r>10</r>
            <r>20</r>
        </nv>
    </ni>
</nd>

Console.WriteLine打印正确的<noid>文本,因此我知道我已经找到了具有相关数据的部分。

我的问题是,我怎么能读四个<r>在这个<noid> ?理想情况下,在IF语句中,我如何读取<nv></nv>之间的所有<r>元素?

谢谢。

当我找到相关的父节点时获得XML节点的详细信息

使用Linq-to-xml

var xmlText = File.ReadAllText(@"C:'YourDirectory'YourFile.xml");
var xDoc = XDocument.Parse(xmlText);
var rValues = new List<string>(); //THIS IS YOUR RESULT
var nvNodes = xDoc.Descendants("nv");
foreach(var el in nvNodes)
{
    if (el.Element("noid").Value.Contains("Server=1,Function=1,Location="))
        rValues = el.Elements("r").Select(e => e.Value).ToList();
}

或者,将foreach替换为Linq(如果First()不满足则失败)

var rValues = nvNodes.
                First(nv => nv.Value.Contains("Server=1,Function=1,Location="))
                .Elements("r")
                .Select(r => r.Value);

非优化的非linq解

XmlDocument doc = new XmlDocument();
doc.XmlResolver = null;
doc.Load(@"C:'YourDirectory'YourFile.xml");
var rValues = new List<string>(); //THIS IS YOUR RESULT
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("//nd/ni/nv");
foreach (XmlNode node in nodes)
{
    if (node.FirstChild.InnerText.Contains("Server=1,Function=1,Location="))
    {
        foreach(XmlNode childnode in node.ChildNodes)
        {
            if (childnode.Name == "r")
                rValues.Add(childnode.InnerText);
        }
    }
}

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = 
                "<nd>" +
                    "<ni>" +
                        "<nv>" +
                            "<noid>Managed=1,Network=1,smtp=1</noid>" +
                            "<r>27</r>" +
                            "<r>4</r>" +
                        "</nv>" +
                        "<nv>" +
                            "<noid>Managed=1,Network=1,Ibc=1</noid>" +
                            "<r>8</r>" +
                            "<r>2</r>" +
                        "</nv>" +
                        "<nv>" +
                            "<noid>Server=1,Function=1,Location=24</noid>" +
                            "<r>124</r>" +
                            "<r>2</r>" +
                            "<r>43</r>" +
                            "<r>90</r>" +
                        "</nv>" +
                        "<nv>" +
                            "<noid>Unmanaged=9,Label=7,Place=5</noid>" +
                            "<r>10</r>" +
                            "<r>20</r>" +
                        "</nv>" +
                    "</ni>" +
                "</nd>";

            XElement nd = XElement.Parse(input);
            var results = nd.Descendants("nv").Select(x => new
            {
                noid = (string)x.Element("noid"),
                r = x.Elements("r").Select(y => (int)y).ToList()
            }).ToList();

        }
    }
}
​

一个简短但难以理解的XPath表达式:

XmlNodeList rNodes = root.SelectNodes(
    "nd/ni/nv[noid/text()[contains(.,'Server=1,Function=1,Location=')]]/r");
foreach (XmlNode rNode in rNodes)
    Console.WriteLine(rNode.InnerText);