查询具有多个具有相同名称和不同属性值的元素的XML文档

本文关键字:属性 XML 文档 元素 查询 | 更新日期: 2023-09-27 18:04:00

我有一个XML Document,它有几个具有相同名称和不同属性值的元素,我正在查询从文档到数组的数据

 foreach (var trade in doc.Descendants("Trd"))
            {
                var RptSide = trade.Element("RptSide");
 sellerAccount = RptSide.Elements("Pty")
                        .Where(pty => pty.Attribute("Src").Value == "C")
                        .Select(pty => pty.Attribute("ID").Value)
                        .FirstOrDefault();
}

我的XML如下

<Trd>      
      <RptSide  Side="1">
        <Pty R="1" ID="666">
        </Pty>
        <Pty R="4" ID="666">
        </Pty>
        <Pty R="7" ID="ABC">
        </Pty>
        <Pty R="21" ID="CCC">
        </Pty>
        <Pty R="22" ID="NY">
        </Pty>
        **<Pty R="24" Src="C" ID="666ID">**
          <Sub Typ="26" ID="1">
          </Sub>
        </Pty>
        <Pty R="24" Src="H" ID="A-62370">
        </Pty>
        <Pty R="30" ID="apm">
        </Pty>
        <Pty R="36" ID="testausto">
          <Sub Typ="9" ID="Addo Ace">
          </Sub>
        </Pty>  
      </RptSide>
    </Trd>

从上面的XML中,我期待第五个Pty元素的ID,其中Attribute Src="C"666ID将存储在sellerAccount中,但它只考虑第一个Pty元素,其中没有Src属性,可能是因为使用FirstOrDefault()

:

An unhandled exception of type 'System.NullReferenceException' occurred in TestXM.exe
Additional information: Object reference not set to an instance of an object.

但是当我把代码改为下面时,它就正常工作了

sellerAccount = RptSide.Elements("Pty")
                        .Where(pty => pty.Attribute("R").Value == "24")
                        .Select(pty => pty.Attribute("ID").Value)
                       .FirstOrDefault();

我可以知道查询文档寻找Src属性的Pty元素的正确方法吗?

查询具有多个具有相同名称和不同属性值的元素的XML文档

您只需要在调用.Value之前对Src属性结果进行空检查,以避免NullReferenceException

例如,

var sellerAccount = RptSide.Elements("Pty")
            .Where(pty => pty.Attribute("Src") != null && pty.Attribute("Src").Value.Equals("C"))
            .Select(pty => pty.Attribute("ID").Value)
            .FirstOrDefault();

或者,(带using System.Xml.XPath;)

var sellerAccount = doc.XPathSelectElement("//*[@Src='C']").Attribute("ID").Value;