如何从.net c中的xml文件获取值#

时间:2017-12-23 20:05:23

标签: c# linq linq-to-xml

我有一个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>

2 个答案:

答案 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));