Member 12692000 Ответов: 1

Как проверить, существуют ли определенные дочерние узлы внутри определенных родительских узлов?


У меня есть несколько xml файлов подобный этому
Я хочу обыскать каждый из них mixed-citation и проверьте, существует ли какой-либо из заданных тегов в a mixed-citation с определенным значением атрибута publication-type и получить родителя ref и имя неподдерживаемого тега, который сопоставляется.
Вот это да список неподдерживаемых тегов для конкретного случая publication-type
ПРИМЕР XML:
<?xml version="1.0"?>
<ref-list>
<title>References</title>
<ref id="ref1"><label>[1]</label><mixed-citation publication-type="patent"><person-group person-group-type="author"><string-name><surname>Angel’skii</surname>, <given-names>O.,V.</given-names></string-name>, <string-name><surname>Ushenko</surname>, <given-names>A.,G.</given-names></string-name>, <string-name><surname>Arkhelyuk</surname>, <given-names>A.,D.</given-names></string-name>, <string-name><surname>Ermolenko</surname>, <given-names>S.,B.</given-names></string-name>, <string-name><surname>Burkovets</surname>, <given-names>D.,N.</given-names></string-name></person-group>, "<article-title>Scattering of laser radiation by multifractal biological structures</article-title>." <source>Optika ieee Spektroskopiya 88</source> (<issue>3</issue>), <fpage>495</fpage>–<lpage>498</lpage> (<year>2000</year>).</mixed-citation></ref>
<ref id="ref2"><label>[2]</label><mixed-citation publication-type="periodical"><person-group person-group-type="author"><string-name><surname>Angelsky</surname>, <given-names>O.,V.</given-names></string-name>, <string-name><surname>Hanson</surname>, <given-names>S., G.</given-names></string-name>, <string-name><surname>Zenkova</surname>, <given-names>C.,Yu.</given-names></string-name>, <string-name><surname>Gorsky</surname>, <given-names>M.,P.</given-names></string-name>, <string-name><surname>Gorodyns’ka</surname>, <given-names>N.,V.</given-names></string-name></person-group>, "<article-title>On polarization metrology (estimation) of the degree of coherence of optical waves</article-title>." <source>Optics Express</source> <volume>17</volume>(<issue>18</issue>), pp.<fpage>15623</fpage>–<lpage>15634</lpage> (<year>2009</year>).</mixed-citation></ref>
<ref id="ref3"><label>[3]</label><mixed-citation publication-type="periodical"><person-group person-group-type="author"><string-name><surname>Angelsky</surname>, <given-names>O.,V.</given-names></string-name>, <string-name><surname>Maksimyak</surname>, <given-names>P.,P.</given-names></string-name>, <string-name><surname>Hanson</surname>, <given-names>S.,G.</given-names></string-name>, <string-name><surname>Ryukhin</surname>, <given-names>V.,V.</given-names></string-name></person-group>, "<article-title>New Feasibilities for Characterizing Rough Surfaces by Optical-Correlation Techniques</article-title>" <source>Applied Optics</source> (<issue>40</issue>) , pp. <fpage>5693</fpage>–<lpage>5707</lpage> <conf-date>12-15-2007</conf-date> (<year>2001</year>).</mixed-citation></ref>
<ref id="ref4"><label>[4]</label><mixed-citation publication-type="book"><person-group person-group-type="author"><string-name><surname>Ushenko</surname>, <given-names>Yu.,O.</given-names></string-name>, <string-name><surname>Dubolazov</surname>, <given-names>O., V.</given-names></string-name>, <string-name><surname>Karachevtsev</surname>, <given-names>A.,O.</given-names></string-name>, <string-name><surname>Gorsky</surname>, <given-names>M., P.</given-names></string-name>, <string-name><surname>Marchuk</surname>, <given-names>Yu., F.</given-names></string-name></person-group>, "<article-title>Wavelet analysis of Fourier polarized images of the human bile</article-title>." <source specific-use="IEEE">Applied Optics</source> (<issue>51</issue>), P. <fpage>133</fpage>–<lpage>139</lpage> (<year>2012</year>).</mixed-citation></ref>
<ref id="ref5"><label>[5]</label><mixed-citation publication-type="periodical"><person-group person-group-type="author"><string-name><surname>Angelsky</surname>, <given-names>O.,V.</given-names></string-name>, <string-name><surname>Ushenko</surname>, <given-names>A.,G.</given-names></string-name>, <string-name><surname>Burkovets</surname>, <given-names>D.,N.</given-names></string-name>, <string-name><surname>Ushenko</surname>, <given-names>Y., A.</given-names></string-name></person-group>, "<article-title>Polarization visualization and selection of biotissue image two-layer scattering medium</article-title>." <source>Journal of biomedical optics</source> <volume>10</volume>(<issue>1</issue>), P.<fpage>14010</fpage> (<year>2005</year>).</mixed-citation></ref>
<ref id="ref6"><label>[6]</label><mixed-citation publication-type="periodical"><person-group person-group-type="author"><string-name><surname>Angelsky</surname>, <given-names>O.,V.</given-names></string-name>, <string-name><surname>Polyanskii</surname>, <given-names>P.,V.</given-names></string-name>, <string-name><surname>Felde</surname>, <given-names>C.,V.</given-names></string-name></person-group>, "<article-title>The emerging field of correlation optics</article-title>." <source>Optics and Photonics News</source> <volume>23</volume>(<issue>4</issue>), p.p.<fpage>25</fpage>–<lpage>29</lpage> (<year>2012</year>).</mixed-citation></ref>
<ref id="ref7"><label>[7]</label><mixed-citation publication-type="periodical"><person-group person-group-type="author"><string-name><surname>Angelsky</surname>, <given-names>O.,V.</given-names></string-name>, <string-name><surname>Bekshaev</surname>, <given-names>A.,Ya.</given-names></string-name>, <string-name><surname>Maksimyak</surname>, <given-names>P.,P.</given-names></string-name>, <string-name><surname>Maksimyak</surname>, <given-names>A.,P.</given-names></string-name>, Mokhun, <string-name><surname>Hanson</surname>, <given-names>S.,G.</given-names></string-name>, <string-name><surname>Zenkova</surname>, <given-names>C., Yu.</given-names></string-name>, <string-name><surname>Tyurin</surname>, <given-names>A.,V.</given-names></string-name></person-group>, "<article-title>Circular motion of particles suspended in a Gaussian beam with circular polarization validates the spin part of the internal energy flow</article-title>." <source>Optics Express</source> <volume>20</volume>(<issue>10</issue>), pp.<fpage>11351</fpage>–<lpage>11356</lpage> (<year>2012</year>).</mixed-citation></ref>
<ref id="ref8"><label>[8]</label><mixed-citation publication-type="periodical"><person-group person-group-type="author"><string-name><surname>Angelsky</surname>, <given-names>O.V.</given-names></string-name>, <string-name><surname>Besaha</surname>, <given-names>R.N.</given-names></string-name>, <string-name><surname>Mokhun</surname>, <given-names>I.I.</given-names></string-name></person-group> "<article-title>Appearance of wavefront dislocations under interference among beams with simple wavefronts</article-title>," <source>Optica Applicata</source> <volume>27</volume>(<issue>4</issue>), Pages <fpage>272</fpage>–<lpage>278</lpage> <edition>5</edition> (<year>1997</year>).</mixed-citation></ref>
<ref id="ref9"><label>[9]</label><mixed-citation publication-type="book"><person-group person-group-type="author"><string-name><surname>Angelsky</surname>, <given-names>P., O.</given-names></string-name>, <string-name><surname>Ushenko</surname>, <given-names>A., G.</given-names></string-name>, <string-name><surname>Dubolazov</surname>, <given-names>A., V.</given-names></string-name>, <string-name><surname>Sidor</surname>, <given-names>M., I.</given-names></string-name>, <string-name><surname>Bodnar</surname>, <given-names>G., B.</given-names></string-name>, <string-name><surname>Koval</surname>, <given-names>G.</given-names></string-name>, <string-name><surname>Trifonyuk</surname>, <given-names>L.</given-names></string-name></person-group>, "<article-title>The singular approach for processing polarization-inhomogeneous laser images of blood plasma layers</article-title>." <source source-type="IEEE">J. Opt.</source> (<issue>15</issue>), <fpage>044030</fpage> (<year>2013</year>).</mixed-citation></ref>
</ref-list>


Что я уже пробовал:

XDocument doc=XDocument.Load(@"D:\ref.xml");

var invalid_citations1=doc.Descendants("mixed-citation").Where(q=>q.Attribute("publication-type").Value=="periodical")
	.Where(a=>a.Descendants("edition").Any() || a.Descendants("chapter-title").Any()||a.Descendants("conf-date").Any()||a.Descendants("conf-loc").Any()||a.Descendants("conf-name").Any()||a.Descendants("conf-sponsor").Any())
	.Select(x=>x.Parent.Attribute("id"));

var invalid_citations2=doc.Descendants("mixed-citation").Where(q=>q.Attribute("publication-type").Value=="book")
	.Where(a=>a.Descendants("article-title").Any() || a.Descendants("conf-sponsor").Any()||a.Descendants("conf-date").Any()||a.Descendants("conf-loc").Any()||a.Descendants("conf-name").Any()||a.Descendants("conf-sponsor").Any()|| a.Descendants("institution").Any() || a.Descendants("ref-degree").Any() || a.Descendants("patent").Any() || a.Descendants("std").Any())
	.Select(x=>x.Parent.Attribute("id"));

foreach (var element in invalid_citations1) {
	Console.WriteLine("Check "+element+" ==> publication-type=\"periodical\": for unsupported tag/tags");
}
foreach (var element in invalid_citations2) {
	Console.WriteLine("Check "+element+" ==> publication-type=\"book\": for unsupported tag/tags");
}
Console.ReadLine();

Но я не могу получить имя неподдерживаемого тега, который сопоставляется для каждого из них mixed-citation..- Как мне это сделать?
Кроме того, как я могу сделать это для всех разных publication-type's в одном выражении, а не делать invalid_citations1, invalid_citations2 .. и т. д.(Как я сделал в своем коде)?

Wendelius

Можете ли вы опубликовать пример XML

Member 12692000

Я действительно разместил ссылку на образец xml-файла, разве он не работает? во всяком случае, я добавил его в вопрос.

1 Ответов

Рейтинг:
6

Wendelius

Не уверен, правильно ли я понимаю вопрос, но чтобы использовать динамический список в предложении where и получить соответствующие теги, рассмотрим следующий пример

var invalidTags = new List<string> { "edition", "chapter-title", "conf-date", "conf-loc", "conf-name", "conf-sponsor" };

var citationQuery = from item in doc.Descendants("mixed-citation")
                    where item.Attribute("publication-type").Value == "periodical"
                    && item.Descendants().Any(x => invalidTags.Contains(x.Name.LocalName))
                    select new {
                       a = item.Parent.Attribute("id"),
                       b = item.Descendants().Where(x => invalidTags.Contains(x.Name.LocalName))
                    };

В возвращаемом классе свойство a содержит атрибут время b содержит список совпадающих тегов

ДОПОЛНЕНИЕ
--------
Чтобы извлечь теги в зависимости от типа публикации, выполните следующие действия

Способ перечисления тегов
public static List<string> GetInvalidTags(string publicationType) {
   List<string> invalidTags = new List<string>();

   if (publicationType == "periodical") {
      invalidTags = new List<string> { "edition", "chapter-title", "conf-date", "conf-loc", "conf-name", "conf-sponsor" };
   }
   return invalidTags;
}

И использование
var citationQuery = from item in doc.Descendants("mixed-citation")
                    where item.Descendants().Any(x => GetInvalidTags(item.Attribute("publication-type").Value).Contains(x.Name.LocalName))
                    select new {
                       a = item.Parent.Attribute("id"),
                       b = item.Descendants().Where(x => GetInvalidTags(item.Attribute("publication-type").Value).Contains(x.Name.LocalName)),
                       c = item.Descendants().Where(x => GetInvalidTags(item.Attribute("publication-type").Value).Contains(x.Name.LocalName)).First().Name
                    };


Member 12692000

Спасибо, это немного помогло, однако один из моих главных вопросов состоял в том, Могу ли я в одном запросе (возможно, используя groupby и анонимные типы или что-то еще, что я просто предполагаю) проверить теги invalidTags для разных item.Attribute("publication-type").Value == например, "периодическое издание", "Книга", "патент" и т. д. Также каждый из них publication-type value имеет свой собственный список invalidTags.

Wendelius

В моем примере я использовал статический список. Что вы можете сделать, так это создать метод, который возвращает определенный список тегов типа публикации и использует его в условии.

Wendelius

Смотрите обновленный ответ.

Member 12692000

Я получаю имя "invalidTags", которое не существует в текущем контексте (CS0103)

Wendelius

Извините, в анонимном классе была опечатка. Смотрите обновленный ответ

Member 12692000

Ценность b это немного сбивает меня с толку, я просто хотел получить название тега, который соответствовал в Any() предложение т. е. имя тега из списка invalidTags список, который действительно совпал.

Wendelius

Свойство b содержит список совпадающих тегов, один или несколько. Я так понимаю, что для каждого элемента может быть множество недопустимых тегов.

Если вас интересует только первый тег, то возьмите первый элемент из списка. Я добавил свойство c, чтобы продемонстрировать это. Взгляните на модифицированное решение.

Member 12692000

Спасибо.

Wendelius

Пожалуйста.