【问题标题】:How do I find a specific XML attribute in a specific place in an XDocument如何在 XDocument 的特定位置找到特定的 XML 属性
【发布时间】:2017-05-17 15:25:19
【问题描述】:

我在下面有一个我的 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

       }

【问题讨论】:

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


    【解决方案1】:

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

    然后您需要找到一个值为RNWBversion 属性。您当前正在寻找不存在的 RNWB 属性。

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

    有关演示,请参阅 this fiddle

    【讨论】:

    • 只是向 OP 指出输入 xml 不是格式正确的 xml。您需要先更正它才能使用上述解决方案。
    • 你说得对,我把它弄得一团糟。主要是因为玩的时间太长了。非常感谢。
    【解决方案2】:

    这样的事情应该可以工作:

        // 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 格式无效:我进行了一些调整并使其正常工作

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 2022-01-05
      • 2020-01-07
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多