如何在 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
。
然后您需要找到值为 RNWB
的 version
属性。您目前正在查找 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");
Select 模型路径
Select 元素版本
其中属性==RNWB
将它们放入列表中以获得结果
// 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>
下面是我的 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
。
然后您需要找到值为 RNWB
的 version
属性。您目前正在查找 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");
Select 模型路径
Select 元素版本
其中属性==RNWB
将它们放入列表中以获得结果
// 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>