我有一个xml文件我希望通过使用linq.Xml获取内部文本如下所示
<?xml version="1.0" encoding="utf-8" ?>
<testObject class="LN" version="16A" distName="CEL-1" id="456" xmlns="kaml20.xsd">
<p name="rcc">424</p>
<p name="kcc">02</p>
<p name="testname">testobject</p>
</testObject>
我做了以下代码而没有结果
private static string GetvalueNokia(XElement pin, string val)
{
string fname="";
try
{
//string location = pin.Descendants("cellName").Single().Value;
//return pin
//.Descendants("p")
//.FirstOrDefault(x => x.Attributes().Any(a => a.Value.ToUpper() == val.ToUpper())).Value;
////.Attribute("value").Value;
var data = from atts in pin.Elements("name")
select new
{
cell= (string)atts.Element("name")
};
}
}
修改 我的销钉如下所示
<testObject class="LN" version="16A" distName="CEL-1" id="456" xmlns="kaml20.xsd">
<p name="cellName">testname</p>
<p name="rcc">424</p>
<p name="kcc">02</p>
</testObject>
答案 0 :(得分:1)
看起来您想要获取xml节点的内部文本,该文本在name
属性中具有特定值,如果这是正确的,您可以尝试以下代码:
var data = (from node in pin.Descendants("name")
where node.Attribute("name") !=null && node.Attribute("name").Value == value
select new
{
AttributeValue = node.Attribute("name").Value,
InnerText = node.Value
});
我们需要首先过滤具有属性name
的节点,并结合它包含作为输入提供的值。
如果您想对xml nodes属性中的输入参数进行不区分大小写的比较,那么您可以使用String.Compare
之类的:
String.Equals(node.Attribute("name").Value, value,StringComparison.OrdinalIgnoreCase)
如果pin
是您尝试获取name
属性值的元素,则只需使用属性名称作为输入调用Attribute
方法,然后访问Value
属性如:
private static string GetvalueNokia(XElement pin, string val)
{
return pin.Attribute("name")?.Value;
}
希望它有所帮助!
答案 1 :(得分:0)
问题在于,当您调用Descendants("p")
等时,由于父节点属于特定命名空间,因此您无法获得结果。
private static string GetValueNokia(XElement pin, string val)
{
XNamespace ns = "kaml20.xsd";
var paragraph = pin.Descendants(ns + "p").FirstOrDefault(
p => p.Attributes("name").FirstOrDefault(a => a.Value == val) != null
);
return paragraph == null ? null : paragraph.Value;
}
你称之为:
var pin = XElement.Parse(xml);
string val = "kcc";
Console.WriteLine(GetValueNokia(pin, val));