【问题标题】:How to change value of child element based on attribute of child and parent?如何根据子元素和父元素的属性更改子元素的值?
【发布时间】:2015-03-20 03:44:49
【问题描述】:

给定这个 xml 文件

<root>
 <event id="123">
     <option subID="1">English</option>
     <option subID="2">German</option>
     <option subID="3">French</option>
     <option subID="4">Spanish</option>
 </event>
</root>

如何将西班牙语的值更改为日语?

我有这个 linq 查询:

var nodeToEdit = xml.Descendants("event").Where(x => (string)x.Attribute("subID") == "4");

在用这个查询做了一些事情之后,我用这个来改变值:

foreach(var item in nodeToEdit.Elements())
{
    var query = item.Descendants("option").Where(z => (string)z.Attribute("subID").Value == "4");
    foreach (var bla in query)
    {
        bla.Value = "Japanese"; // bla.Value = Spanish
    }
}

但是当我调试时,我可以看到我的query 没有结果。

【问题讨论】:

  • 您确定您的 XML 不使用命名空间?
  • &lt;event&gt; 没有subID 属性:var nodeToEdit = xml.Descendants("event").Where(x =&gt; (string)x.Attribute("subID") == "4");

标签: c# xml linq


【解决方案1】:

如果那是您的实际代码和 XML,那么是的,它不起作用的原因不止一个。这是修复它的一种可能方法:

//select <event> node by id attribute
var nodeToEdit = xml.Descendants("event")
                    .FirstOrDefault(x => (string)x.Attribute("id") == "123");
if(nodeToEdit != null)
{
    //select <option> node within current <event> by subID attribute
    var optionToEdit = nodeToEdit.Elements()
                                 .FirstOrDefault(z => (string)z.Attribute("subID") == "4");
    optionToEdit.Value = "Japanese";
}

或者,只有当以下内容对您来说仍然可读时,您才能一口气完成:

//select <option> node based on id attribute of it's parent & subID attribute of it's own
var nodeToEdit = xml.Descendants("option")
                    .FirstOrDefault(x => (string)x.Parent.Attribute("id") == "123"
                                            &&
                                         (string)x.Attribute("subID") == "4"
                                   );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多