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

C# 当属性附加到XML元素时,在C中查找该元素的值,c#,xml,attributes,element,xmldocument,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:Measureme

我需要处理以下XML文档

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

如果有人对这个问题有任何意见,并且有办法得到这些“测量单位”,我将非常感激

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

使用LINQtoXML和C6,假设ns0的URL为http://foo.bar/:

注意?。需要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();

尽管使用了“LINQ”和“XML”库引用,但我没有这些命令中的一些可以使用。是否无法将ns0:UnitOfMeasureCode视为元素名称并忽略附加的属性和命名空间?我看到了一些对格式“.GetElementsByTagNamens0:UnitOfMeasureCode,[@Domain=UN-Rec-20]”的引用,但我还没有让它正常工作。如果有帮助的话,我相信我正在将c 5.0与.Net 4.5结合使用。@MBrockley您需要对System.Xml.Linq.dll的引用。我在这里使用的唯一C6功能是?。。我将发送不需要的代码版本。是否无法将ns0:UnitOfMeasureCode视为元素名称并忽略附加的属性和命名空间?不,XML不是这样工作的。。。
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();
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();