2013-11-02 7 views
0

получил этот документ:Namespaced узлы одного и того же имени - содержание атрибутов, необходимых

<uniprot xmlns="http://uniprot.org/uniprot" xmlns:xsi="http://www.w3.org/2001/ XMLSchema-instance" xsi:schemaLocation="http://uniprot.org/uniprot http://www.uniprot.org/support/docs/uniprot.xsd"> 
<entry dataset="Swiss-Prot" created="1986-07-21" modified="2013-10-16" version="88"> 
<dbReference type="GO" id="GO:0006412"> 
<property type="term" value="P:translation"/> 
<property type="evidence" value="IEA:InterPro"/> 
</dbReference> 
<dbReference type="HAMAP" id="MF_00294"> 
<property type="entry name" value="Ribosomal_L33"/> 
<property type="match status" value="1"/> 
</dbReference> 
<dbReference type="InterPro" id="IPR001705"> 
<property type="entry name" value="Ribosomal_L33"/> 
</dbReference> 

Прямо сейчас, я использую это, чтобы захватить внутренний текст узлов, который работает отлично ... НО. ..

XmlDocument XMLdoc = new XmlDocument(); 
XMLdoc.Load(Datapath); 
XmlNamespaceManager nsmgr = new XmlNamespaceManager(XMLdoc.NameTable); 
nsmgr.AddNamespace("ns", "http://uniprot.org/uniprot"); 
String NodeName = XMLdoc.SelectSingleNode("//ns:fullName", nsmgr).InnerText; 

... Мне нужно, чтобы захватить атрибуты и является ли тип контента является GO или нет, и если да, то получим следующие данные этого точного узла, а именно идентификатор и значение. Задумывались об этом и заглядывали в него за несколько часов, и мне просто не хватает знаний, чтобы добраться куда угодно.

ответ

0

На самом деле мне удалось решить эту проблему:

  XmlNodeList Testi = XMLdoc.SelectNodes("//ns:dbReference", nsmgr); 
      foreach (XmlNode xn in Testi) 
      { 
       if (xn.Attributes["type"].Value == "GO") 
       { 
        String Testilator = xn.Attributes["id"].Value; 
        String Testilator2 = xn.FirstChild.Attributes["value"].Value; 

       } 
      } 
0

Я предлагаю использовать Linq to Xml, я нахожу его намного проще, чем запросы XmlDocument и XPath, но это, по крайней мере, частично личное предпочтение.

Я не совсем уверен, что вы подразумеваете под «значением» каждого элемента с типом «GO», но это должно сделать вам большую часть пути. goTypeNodes будет содержать коллекцию тех узлов, которые имеют тип «GO» с их идентификаторами и значениями типа, и дополнительно содержит элементы свойств под ними, поэтому, если под «значением» вы подразумеваете значение элементов свойства под ними, это тривиально, чтобы получить от этого.

XNamespace ns = "http://uniprot.org/uniprot"; 
XDocument doc = XDocument.Load(@"C:\SO\Foo.xml"); 

var goTypeNodes = from n in doc.Descendants(ns + "dbReference") 
        select new { Id = n.Attribute("id").Value, Type = n.Attribute("type").Value, Properties = n.Elements()}; 

Кстати, ваш образец XML отсутствует, чтобы закрыть теги для uniprot и entry.

+0

Конечно, это. Я вырезал только важные части этого документа. Вот что выглядит в целом: http://www.uniprot.org/uniprot/P30178.xml dbReference находится там примерно 20 раз. Мне нужно выделить узлы dbReferene по его атрибутам. Если атрибут type установлен как «GO» (обычно есть около 3-10, которые содержат «GO»), я хочу, чтобы остальная часть этого узла и дочерний узел. Или, если быть более точным: если тип dbReference == «GO» получает идентификатор dbReference этого точного узла и атрибут content value свойства дочернего узла. – MeepMania

Смежные вопросы