【问题标题】:Amending an XML file using C# containing multiple nodes使用 C# 修改包含多个节点的 XML 文件
【发布时间】:2020-01-01 14:57:55
【问题描述】:

我正在尝试在 Visual Studio 2017 中开发一个简单的 c# 程序,该程序循环通过 XML 文件,并将根据文件中的“类型”编号修改某些节点。每个“代码”都有不同的类型编号。

例如,如果类型编号 = 4,则将附加信息添加到节点“名称”。例如,最后的姓氏。

但是我不希望它修改出现在类型 5 下的节点“名称”。我查看了其他问题和答案,但这些问题并没有处理文件中的多个后代!

<?xml version="1.0" encoding="utf-8"?>
<testing>
    <names>
        <name>
            <code>0000</code>
            <type>4</type>
            <steps>
                <nStep>
                    <name>John</name>
                </nStep>
            </steps>
        </name>
        <name>
            <code>1111</code>
            <type>5</type>
            <steps>
                <nStep>
                    <name>Paul</name>
                </nStep>
            </steps>
        </name>
    </names>
</testing>

【问题讨论】:

    标签: c# xml xmlreader


    【解决方案1】:

    您可以使用 Linq to XML 来执行此操作。

    根据您需要的灵活性,这里有几种不同的方法。首先,使用XPath(需要引用System.Xml.XPath获取相关的扩展方法)。在这里,您可以使用 XPath 查询表达式过滤要更改的节点,例如,在这种情况下,我们仅迭代类型为“4”的节点:

    // you can load xml from string or however you have it
    var xDoc = XDocument.Load(@"c:\temp\myxml.xml"); 
    
    foreach (var nameElement in xDoc.XPathSelectElements("//testing/names/name[type='4']"))
    {
        nameElement
            .Descendants("name")
            .Single()
            .Value += " Smith";
    }
    

    或者,这种方法将迭代父元素names 下的所有name 元素,并允许您打开type 元素的值以在每种情况下执行不同的操作:

    // select the name elements, and parse the type into an integer (optional, you can 
    // switch on type as a string if you prefer).
    var nameElements = xDoc
        .Element("testing")
        .Element("names")
        .Elements("name")
        .Select(name => new { Type = int.Parse(name.Element("type").Value), Element = name });
    
    // iterate on each name element
    foreach (var nameElement in nameElements)
    {
        // check the type
        switch (nameElement.Type)
        {
            case 4:
                nameElement
                    .Element
                    .Descendants("name") // filter to name elements under the parent name element
                    .Single() // we only expect one
                    .Value += " Smith"; // append a last name
                break;
            default:
                continue; // don't do anything
        }
    }
    

    【讨论】:

    • 谢谢我试一试
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多