2017-02-28 107 views
0

我有以下XML文档可以使用。当属性附加到该元素时,在C#中查找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

您需要考虑XML名称空间。 ns0不是元素名称的真正组成部分,它是映射到名称空间(通常是URL)的前缀。

使用LINQ到XML和C#6,假设ns0的URL为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(); 
+0

我没有一些命令,尽管使用“LINQ”和“XML”库参考使用。是否没有办法将“ns0:UnitOfMeasureCode”作为元素名称并忽略附加的属性和名称空间?我已经看到格式'.GetElementsByTagName(“ns0:UnitOfMeasureCode”,[@ Domain =“UN-Rec-20”])的一些引用'',但我还没有正确工作。如果有帮助,我相信我正在使用.NET 4.5的c#5.0。 – MBrockley

+0

@MBrockley你需要一个对System.Xml.Linq.dll的引用。我在这里使用的唯一C#6功能是'?.'。我会发送一个不需要它的代码版本。 –

+0

“是否没有办法将”ns0:UnitOfMeasureCode“作为元素名称并忽略附加属性和名称空间?”不,这不是XML的工作原理... –