这是我在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时出错。
答案 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。