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

时间:2017-05-17 15:25:20

标签: c# xml linq-to-xml xelement

我在下面有一个我的XML示例(我在检查之前将其从SGML转换为XML,但除了这一点之外)。 XML在检查时有效。

我需要检查XDocument并查看文件顶部<version>部分中包含的任何<status>元素是否包含attriubute“RNWB”。我需要明确指出,我只对检查<version>元素的<status>元素感兴趣,因为文档中可能还有其他<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

       }

2 个答案:

答案 0 :(得分:0)

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

然后,您需要找到值为version的{​​{1}}属性。您目前正在寻找一个不存在的RNWB属性。

RNWB

有关演示,请参阅this fiddle

答案 1 :(得分:0)

这样的事情应该有效:

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

  2. 选择元素版本

  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格式不正确:我做了一些调整并使其正常工作

  5. <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>