【问题标题】:Find the value of an XML Element in C# when an attribute is attached to that Element当属性附加到该元素时,在 C# 中查找 XML 元素的值
【发布时间】:2017-02-28 23:15:14
【问题描述】:

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

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

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

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

如果有人对这个问题有任何启发以及获得这些“测量单位”的方法,我将不胜感激。

【问题讨论】:

    标签: c# xml attributes element xmldocument


    【解决方案1】:

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

    使用 Linq to 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 你需要参考System.Xml.Linq.dll。我在这里使用的唯一 C# 6 功能是?.。我会发送一个不需要的代码版本。
    • “有没有办法将“ns0:UnitOfMeasureCode”视为元素名称而忽略附加的属性和命名空间?”不,这不是 XML 的工作原理……
    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多