当属性附加到该元素时,在C#中查找XML元素的值
问题描述:
我有以下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;
如果任何人有任何煽动到这个问题,并有办法让这些“计量单位”我将非常感激。
答
您需要考虑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();
我没有一些命令,尽管使用“LINQ”和“XML”库参考使用。是否没有办法将“ns0:UnitOfMeasureCode”作为元素名称并忽略附加的属性和名称空间?我已经看到格式'.GetElementsByTagName(“ns0:UnitOfMeasureCode”,[@ Domain =“UN-Rec-20”])的一些引用'',但我还没有正确工作。如果有帮助,我相信我正在使用.NET 4.5的c#5.0。 – MBrockley
@MBrockley你需要一个对System.Xml.Linq.dll的引用。我在这里使用的唯一C#6功能是'?.'。我会发送一个不需要它的代码版本。 –
“是否没有办法将”ns0:UnitOfMeasureCode“作为元素名称并忽略附加属性和名称空间?”不,这不是XML的工作原理... –