c#-查找没有根元素的节点值

时间:2019-03-08 12:18:42

标签: c# xml

这是我在sql中的列值:

<ProductId>101</ProductId>
<ProductName>TShirt</ProductName>
<Description>UCB</Description>
<Category>199</Category>
<Weight>150</Weight>
<Price>2500</Price>
<images></images>

有时候看起来也是这样:

<ProductId xsi:nil="true" ></ProductId> 
<ProductName>Toys</ProductName>
<Description xsi:nil="true" ></Description>
<Category xsi:nil="true" ></Category>
<Weight xsi:nil="true" ></Weight>
<Price xsi:nil="true" ></Price>
<images></images>

我想从此列中提取“ ProductName”值,即TShirt。可以是任何节点,我该怎么做?

这是我的C#代码

var xml = XElement.Parse(xmlString);

string fieldValue = xml.Element(fieldToSearch).ToString();

但是由于它不是正确的xml字符串,因此会出错,所以我明确地写了

string xmlString = "<root>" + columnValue + "</root>";

查找节点值的正确方法是什么?

编辑:可以为任何节点的“重量/描述/价格”提取该值。发现xsi:nil时出错。

1 个答案:

答案 0 :(得分:2)

由于xsi:nil属性的命名空间前缀为xsi,您将收到错误消息。由于缺少父元素,因此没有此前缀的声明。

理想情况下,您应该修复源代码,以便存储格式正确的XML而不是一堆子元素,但是,如果坚持使用它,那么解决此问题的最简单方法是添加名称空间对您的虚拟root元素的声明:

var xmlString = 
    "<root xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + 
    columnValue + 
    "</root>";

第二,我注意到ToString()将返回元素本身,例如<ProductName>Toys</ProductName>。如果只需要该值,则可以使用显式转换:

var fieldValue = (string) xml.Element(fieldToSearch);

有关有效的演示,请参见this fiddle