当属性附加到该元素时,在C#中查找XML元素的值

时间:2017-02-28 23:15:15

标签: c# xml attributes element xmldocument

我有以下XML文档可供使用。

<ns0:ProductQuantity>
    <ns0:Measurement>
        <ns0:MeasurementValue>8500</ns0:MeasurementValue>
        <ns0:UnitOfMeasureCode Domain="UN-Rec-20">KG</ns0:UnitOfMeasureCode>
    </ns0:Measurement>
</ns0:ProductQuantity>

我还无法弄清楚如何将此文档中的“KG”值读入我的C#代码中的字符串。我已经提取了其他元素值,但它们都没有附加Domain="UN-Rec->20"的属性。我正在使用Visual Studio 2013,并且我当前如何提取其他数据的想法如下。

XmlDocument doc = new XmlDocument();
doc.Load(filePath);               
root = doc.DocumentElement;
prodAmt_xml[1] = root.GetElementsByTagName("ns0:MeasurementValue")[0].InnerText;

如果有人有任何煽动这个问题以及获得这些“测量单位”的方法,我将非常感激。

1 个答案:

答案 0 :(得分:1)

您需要考虑XML名称空间。 ns0实际上不是元素名称的一部分,它是映射到命名空间(通常是URL)的前缀。

使用Linq to XML和C#6,假设ns0的网址为http://foo.bar/

var doc = XDocument.Load(filePath);
var ns = XNamespace.Get("http://foo.bar/");
var unit = 
    doc.Descendants(ns + "ProductQuantity")
        .Elements(ns + "Measurement")
            .Elements(ns + "UnitOfMeasureCode")
            .Where(e => e.Attribute("Domain")?.Value == "UN-Rec->20")
            .Select(e => e.Value)
            .FirstOrDefault();

请注意?.需要C#6;如果你使用的是早期版本,你也可以这样做:

var doc = XDocument.Load(filePath);
var ns = XNamespace.Get("http://foo.bar/");
var unit = 
   (from e doc.Descendants(ns + "ProductQuantity")
              .Elements(ns + "Measurement")
              .Elements(ns + "UnitOfMeasureCode")
    let attr = e.Attribute("Domain")
    let domain = attr != null ? attr.Value : null
    where domain == "UN-Rec->20"
    select e.Value).FirstOrDefault();