如何在 XDocument 的特定位置找到特定的 XML 属性

How do I find a specific XML attribute in a specific place in an XDocument

下面是我的 XML 示例(我在检查之前将其从 SGML 转换为 XML,但这不是重点)。 XML 在检查时有效。

我需要检查 XDocument 并找出文件顶部 <status> 部分中包含的任何 <version> 元素是否包含属性 "RNWB"。我需要明确说明我只对检查作为 <status> 元素子元素的 <version> 元素感兴趣,因为文档中可能还有其他我不知道的 <version> 元素不关心。

<dmodule>
    <idstatus>
        <dmaddres>
            <dmc>Blah</dmc>
            <dmtitle><techname>System</techname><infoname>Introduction</infoname></dmtitle>
            <issno issno="006" type="revised"/>
            <issdate year="2016" month="11" day="30"/>
        </dmaddres>
        <status>
            <security class="2"/>
            <rpc></rpc>
            <orig></orig>
            <applic>
                <model model="2093">
                    <version version="BASE"></version>
                    <version version="RNWB"></version></model>
            </applic>
            <techstd>
                <autandtp>
                    <authblk></authblk>
                    <tpbase></tpbase>
                </autandtp>
                <authex></authex>
                <notes></notes>
            </techstd>
            <qa>
            <firstver type="tabtop"/></qa>
            <remarks></remarks>
        </status>
    </idstatus>
    <content>
        <refs><norefs></refs>
        <descript>
            <para0><title>Introduction</title>
                <para>The system many new features included which are safe and accurate blah blah blah.</para>
        </descript>
    </content>
</dmodule>

我尝试了各种方法,但似乎无法得到结果。这是我尝试过的一个例子:

var result = (from ele in doc.Descendants("applic").Descendants("version").Attributes("RNWB")
                                      select ele).ToList();

      foreach (var v in result)
      {
          File.Move(file, Path.Combine(outputFolder, fileName)); // move the file to the new folder

       }

如果您必须明确指出 version 元素在 status 元素内,那么您也需要在查询中明确说明这一点。您的示例在任何地方都不包含 version

然后您需要找到值为 RNWBversion 属性。您目前正在查找 RNWB 属性,该属性不存在。

var hasFlag = doc
    .Descendants("status")
    .Descendants("version")
    .Attributes("version")
    .Any(x => x.Value == "RNWB");

有关演示,请参阅 this fiddle

像这样的东西应该可以工作:

    // Load document
    XDocument _doc = XDocument.Load("C://t//My File2.txt");
  1. Select 模型路径

  2. Select 元素版本

  3. 其中属性==RNWB

  4. 将它们放入列表中以获得结果

          // if you need to get the version element where the atrribute == something
          List<XElement> model = _doc
            .XPathSelectElement("dmodule/idstatus/status/applic/model")
            .Elements("version")
            .Where(x => x.Attribute("version").Value == "RNWB")
            .ToList();
    
           // if you only need to check if the attribute exists
           bool contains = _doc
            .XPathSelectElement("dmodule/idstatus/status/applic/model")
            .Elements("version")
            .Any(x => x.Attribute("version").Value == "RNWB");
    

    XML 的格式无效:我做了一些调整并使其正常工作

<dmodule>
    <idstatus>
        <dmaddres>
            <dmc>Blah</dmc>
            <dmtitle><techname>System</techname><infoname>Introduction</infoname></dmtitle>
            <issno issno="006" type="revised"/>
            <issdate year="2016" month="11" day="30"/>
        </dmaddres>
        <status>
            <security class="2"/>
            <rpc></rpc>
            <orig></orig>
            <applic>
                <model model="2093">
                    <version version="BASE"></version>
                    <version version="RNWB"></version>
  </model>
            </applic>
            <techstd>
                <autandtp>
                    <authblk></authblk>
                    <tpbase></tpbase>
                </autandtp>
                <authex></authex>
                <notes></notes>
            </techstd>
            <qa>
            <firstver type="tabtop"/></qa>
            <remarks></remarks>
        </status>
    </idstatus>
    <content>
        <refs>
  <norefs>
  </norefs>
 </refs>
        <descript>
            <para0>
                <title>Introduction</title>
                <para>The system many new features included which are safe and accurate blah blah blah.</para>
            </para0>
        </descript>
    </content>
</dmodule>