首页 > 解决方案 > c# - 查找没有根元素的节点值

问题描述

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

标签: c#xml

解决方案


您收到错误消息,因为该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);

请参阅此小提琴以获取工作演示。


推荐阅读