我使用XElement
创建XMLDocument
,用于分层WPF树视图。如果我用:
x_element = new XElement("node",
new XElement("tree_id", strData[0]),
new XElement("sys_id", dpl.DepSysId),
new XElement("part_id", strData[8]),
new XElement("make", strData[6]),
new XElement("model", strData[5]),
new XElement("level", strData[2]));
然后我需要向“node”添加属性,所以我尝试了:
XElement temp_el = x_element.Element("node"); // This is returning null
temp_el.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]);
temp_el.SetAttributeValue("canEdit", "False");
temp_el.SetAttributeValue("status", nStatus.ToString());
temp_el.SetAttributeValue("qty", strData[13]);
temp_el.SetAttributeValue("part", strData[8]);
在上面的代码中,temp_el为null,但我可以在调试器中看到x_element包含以下内容:
<node>
<tree_id>82</tree_id>
<sys_id>82</sys_id>
<part_id>169</part_id>
<make>ST Panel</make>
<model>Logical Pure 16 tube Collector</model>
<level>0</level>
</node>
要解决这个问题,我使用了以下内容:
foreach (XElement temp_el in x_element.DescendantsAndSelf())
{
if (temp_el.Name == "node")
{
temp_el.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]);
temp_el.SetAttributeValue("canEdit", "False");
temp_el.SetAttributeValue("status", nStatus.ToString());
temp_el.SetAttributeValue("qty", strData[13]);
temp_el.SetAttributeValue("part", strData[8]);
break;
}
}
虽然上面的工作,我只是好奇为什么我得到null返回。我的解决方法是最好的方法吗?
问候。
答案 0 :(得分:3)
您定义了这样的XElement:
x_element = new XElement("node", /* child nodes */);
"node"
是您要创建的XElement
的名称,以下参数是其子项。
通过使用x_element.Node("node")
,您尝试获取名为"node"
的子节点,并且没有这样的子节点。
x_element
本身是名为“node”的节点
DescendantsAndSelf
之所以有效,是因为它包含x_element
(因此是“AndSelf”),但您也不需要这个,因为您已经拥有该节点。
因此,您可以将第二个代码段更改为:
x_element.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]);
x_element.SetAttributeValue("canEdit", "False");
// etc.
(顺便说一下,你也可以在构造函数中添加属性)
答案 1 :(得分:1)
因为您的第一个temp_el
,
XElement temp_el = x_element.Element("node");
您曾经获取过未被视为x_element元素的节点。
它被视为其根源。但是,第二个,
x_element.DescendantsAndSelf()`
您使用此XElement
方法将节点本身视为元素。
XContainer.Elements Method - 按文档顺序返回此元素或文档的子元素的集合。
XElement.DescendantsAndSelf Method - 按文档顺序返回包含此元素以及此元素的所有后代元素的元素集合。
答案 2 :(得分:0)
为解决此问题,我使用了Descendants()。这是我的代码段
public void UpdateEnquiry([FromBody]XElement UpdatePurchaseOrder)
{
var obj = XElement.Parse(UpdatePurchaseOrder.ToString());
var ii = (from v in obj.Descendants() select new { v.Value }).ToList() ;
}