У нас сложная структура XML и действительно большая (> 500 МБ). XSD структуры: Этот XSD
Как мы знаем, это сложный вопрос. и из-за размера или структуры разделителя без табуляции я не мог преобразовать его в более удобочитаемую презентацию.
Я хочу прочитать этот файл через C# и найти название препарата. что не так с моим кодом?
try
{
XmlReader xmlFile;
xmlFile = XmlReader.Create("C:\\Users\\Dr\\Desktop\\full database.xml", new XmlReaderSettings());
DataSet ds = new DataSet();
ds.ReadXml(xmlFile);
dataGridView1.DataSource = ds.Tables[0];
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
Моя ошибка такова:

Как я могу выполнить поиск в этом XML и получить информацию о названии лекарства?
Обновление: образец XML
С красивым ответом jdweng мы хотим извлечь всю информацию.
@MarcGravell Я получаю сообщение об ошибке через XmlReader? как мне попробовать?
@bommelding Я имею в виду очень сложный.
@MinaSoli какая ошибка?
@MarcGravell разрешил мне несколько раз добавить картинку.
@bommelding есть раз, когда у изображений есть достоинства, обратите внимание; Я не собираюсь ни в коем случае предполагать по этой теме
@bommelding добавляю цифру, очень странная ошибка !!
Что вы имеете в виду под «поиском названия лекарства»?
@TomW в примере выше «Refludan» - это название лекарства.
@MinaSoli Я догадался, но что вы имеете в виду под словом «искать»? Вы хотите получить список уникальных названий лекарств, представленных в документе, вернуть некоторую информацию, которая является родственником этого названия, или что-то еще? Пожалуйста, будьте конкретны.
@TomW Я хочу поместить текстовое поле, в которое введите название лекарства, выполните поиск по моей базе данных и перечислите информацию о родственных братьях по наркотикам. Я уверен, что принятое решение не совпадает, потому что добавьте другую часть структуры в качестве названия препарата.





Самым простым подходом здесь было бы использовать xsd your.xsd /c, добавить сгенерированный your.cs в проект и просто использовать XmlSerializer против любого типа, являющегося «корневым» типом; похоже, это будет drugbanktype, поэтому:
var ser = new XmlSerializer(typeof(drugbanktype));
var obj = (drugbanktype)ser.Deserialize(reader);
затем просто пройдитесь по obj, чтобы найти то, что вам нужно; предположительно:
foreach(var drug in obj.drug) {
...
}
Примечание. Названия типов, которые выдаёт xsd.exe, ужасны до извинения; они просто отражают структуру xml из xsd. Вы можете изменить их, если хотите, но становится неудобно, если вы когда-нибудь собираетесь обновить xsd и вам нужно повторно сгенерировать C#.
При работе с огромным объемом данных лучше всего использовать XmlReader для пропуска данных, которые вам нужны не, а затем использовать XmlSerializer и программу чтения поддеревьев для чтения данных, которые вам нужны делать; это означает, что вы можете обрабатывать элементы по одному без необходимости десериализации всего в единую объектную модель, что может вызвать проблемы с памятью. Например:
class Program
{
static void Main()
{
using (var reader = XmlReader.Create("my.xml"))
{
var ser = new XmlSerializer(typeof(Product));
while(reader.Read())
{
if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "product"
&& reader.NamespaceURI == "http://www.drugbank.ca")
{
using (var subReader = reader.ReadSubtree())
{
var obj = (Product)ser.Deserialize(subReader);
Console.WriteLine(obj.Name);
}
}
}
}
}
}
[XmlRoot("product", Namespace = "http://www.drugbank.ca")]
public class Product
{
[XmlElement("name", Namespace = "http://www.drugbank.ca")]
public string Name { get; set; }
}
while(reader.Read()) просматривает все узлы последовательно; когда мы обнаруживаем <product> (проверка if), мы используем ReadSubtree для создания суб-ридера, привязанного к этому элементу, и десериализации только этот элемент. Потом продолжаем двигаться вперед.
Уважаемый Марк, не могли бы вы ответить на мой обновленный вопрос? У меня странная ошибка! Я пытаюсь понять ваше экспертное решение.
@MinaSoli код, который я опубликовал, работает для вашего примера xml; просто: не используйте здесь DataSet. Или где-нибудь еще, на самом деле - существует очень мало сценариев, в которых DataSet является хорошим инструментом для использования.
@MinaSoli Я добавил более простую версию в начало своего ответа; вам нужно быть осторожным с объемом данных, которые он будет загружать за один раз, поэтому мой более сложный пример под ним
@MinaSoli сложно читать поддерево; вам гораздо лучше десериализовать объект, отображающий <product>, что и делает показанный мной код; он пишет все названия продуктов. Если вам нужны дополнительные участники: добавьте их
Нет, я запускаю твой код. ничего не отображается !! без ошибок, но ничего не показано.
@MinaSoli Интересно - есть ли корневое пространство имен? проверка ... а, да, это пространство имен http://www.drugbank.ca - вы не включили это в свой образец xml. Итак: пробуем: && reader.NamespaceURI = "http://www.drugbank.ca"
System.InvalidOperationException: «Ошибка выполнения в XML-документе (70, 6)». Ошибка после запуска в этой строке var obj = (Product) ser.Deserialize (subReader);
@MinaSoli снова, это пространство имен; две секунды ... см. править
Очень мило, правда ты бог в программировании
поскольку я просматриваю страницу за страницей много повторяющихся названий лекарств !! как я могу отправить изображение?
Думаю, есть проблема. Есть 6000 наименований лекарств, но я думаю, что они выползли из других частей поддерева! Здесь нет повторяющегося названия препарата, я уверен, что оно произошло от другой части дерева. можно ли бегло взглянуть на XSD?
При более тщательном осмотре я вижу много не связанных названий лекарств. XML DB верна, но я считаю сложной.
Поскольку я работал над этим вопросом около недели, проблема осталась, и эти алгоритмы не работают, я не знаю почему?
Просто чтобы добавить альтернативную версию,
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "product")
{
var productElement = XElement.ReadFrom(reader);
// use element
string productName = productElement.Element("name").Value;
}
}
Класс XElement взят из System.Xml.Linq, я считаю, что это самый простой способ работы с XML (без полной десериализации класса).
Как я определяю "XElement"
Это класс, ставь using System.Xml.Linq; поверх.
что вы имеете в виду под "использовать элементы", я получаю сообщение об ошибке в следующей строке!
Решил трудным путем создать базу данных SQL. Ни один из инструментов не работал. Я складываю только несколько столов. При необходимости вы можете добавить больше.
Шаг 1 Создайте базу данных в SQL Server Management Studio, используя следующий запрос. Запрос может выдавать ошибки, если вы запускаете его несколько раз, а база данных или таблица уже существует.
Выполните следующий проект C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace DrubBank
{
class Program
{
const string FILENAME = @"c:\temp\full database.xml";
static void Main(string[] args)
{
new UploadXml(FILENAME);
}
}
public class UploadXml
{
const string INSERT_DRUG =
"INSERT INTO [DrugBank].[dbo].[Drugs] (" +
"[Type],[Created],[Updated],[ID],[Name],[Description],[Case Number],[Unii],[State]," +
"[Synthesis Reference],[Indication] ,[Pharmacodynamics] ,[Mechanism of Action], [Toxicity]," +
"[Metabolism] , [Absorption] ,[Half Life], [Protein Binding]," +
"[Route of Eelimination], [Volume of Distribution] ,[Clearance])" +
" VALUES " +
"(@Type, @Created, @Updated, @ID, @Name, @Description, @Case_Number, @Unii, @State," +
"@Synthesis_Reference,@Indication ,@Pharmacodynamics ,@Mechanism_of_Action, @Toxicity," +
"@Metabolism , @Absorption ,@Half_Life, @Protein_Binding," +
"@Route_of_Elimination, @Volume_of_Distribution ,@Clearance)";
const string INSERT_DRUG_LINK =
"INSERT INTO [DrugBank].[dbo].[Links] (" +
"[ID],[Title],[URL])" +
" VALUES " +
"(@ID,@Title, @URL)";
const string INSERT_DRUG_ARTICLE =
"INSERT INTO [DrugBank].[dbo].[Articles] (" +
"[ID],[Pubmed ID],[Citation])" +
" VALUES " +
"(@ID,@Pubmed_ID, @Citation)";
const string INSERT_DRUG_INTERACTION =
"INSERT INTO [DrugBank].[dbo].[Interactions] (" +
"[ID],[Interaction ID],[Description])" +
" VALUES " +
"(@ID,@Interaction_ID, @Description)";
const string INSERT_DRUG_ID =
"INSERT INTO [DrugBank].[dbo].[IDs] (" +
"[ID],[ALT ID])" +
" VALUES " +
"(@ID, @ALT_ID)";
const string INSERT_DRUG_PRODUCT =
"INSERT INTO [DrugBank].[dbo].[Products] (" +
"[ID],[Name],[Labeller], [NDC ID], [NDC Product Code], [DPD ID]," +
"[EMA Product Code],[EMA MA Number],[Started Marketing On], [Ended Marketing On], [Dosage Form]," +
"[Strength],[Route],[FDA Application Number],[Generic],[Over the Counter],[Approved],[Country],[Source])" +
" VALUES " +
"(@ID,@Name,@Labeller, @NDC_ID, @NDC_Product_Code,@DPD_ID," +
"@EMA_Product_Code,@EMA_MA_Number,@Started_Marketing_On, @Ended_Marketing_On, @Dosage_Form," +
"@Strength,@Route,@FDA_Application_Number,@Generic,@Over_the_Counter,@Approved,@Country,@Source)";
const string INSERT_DRUG_MIXTURE =
"INSERT INTO [DrugBank].[dbo].[Mixtures] (" +
"[ID], [Name] , [ingredients])" +
" VALUES " +
"(@ID, @Name, @ingredients)";
const string INSERT_DRUG_PACKAGER =
"INSERT INTO [DrugBank].[dbo].[Packagers] (" +
"[ID], [Name], [URL])" +
" VALUES " +
"(@ID, @Name, @URL)";
const string INSERT_DRUG_PRICE =
"INSERT INTO [DrugBank].[dbo].[Prices] (" +
"[ID], [Description], [Cost], [Currency], [Unit])" +
" VALUES " +
"(@ID, @Description, @Cost, @Currency, @Unit)";
const string INSERT_DRUG_CATEGORY =
"INSERT INTO [DrugBank].[dbo].[Categories] (" +
"[ID], [Category], [Mesh ID])" +
" VALUES " +
"(@ID, @Category, @Mesh_ID)";
const string INSERT_DRUG_ORGANISM =
"INSERT INTO [DrugBank].[dbo].[Organisms] (" +
"[ID], [Organism])" +
" VALUES " +
"(@ID, @Organism)";
const string INSERT_DRUG_PATENT =
"INSERT INTO [DrugBank].[dbo].[Patents] (" +
"[ID], [Number], [Country], [Approved], [Expires], [Pediatric Extension]) " +
" VALUES " +
"(@ID, @Number, @Country, @Approved, @Expires, @Pediatric_Extension) ";
const string INSERT_DRUG_SEQUENCE =
"INSERT INTO [DrugBank].[dbo].[Sequences] (" +
"[ID], [Format], [Type], [Sequence])" +
" VALUES " +
"(@ID, @Format, @Type, @Sequence)";
const string INSERT_DRUG_PROPERTY =
"INSERT INTO [DrugBank].[dbo].[Properties] (" +
"[ID], [Kind], [Value], [Source])" +
" VALUES " +
"(@ID, @Kind, @Value, @Source)";
const string INSERT_DRUG_IDENTIFIER =
"INSERT INTO [DrugBank].[dbo].[Identifiers] (" +
"[ID], [Resource], [Identifier])" +
" VALUES " +
"(@ID, @Resource, @Identifier)";
const string INSERT_DRUG_ENZYM =
"INSERT INTO [DrugBank].[dbo].[Enzymes] (" +
"[ID], [UniprotID])" +
" VALUES " +
"(@ID, @UniprotID)";
SqlCommand productCmd = null;
SqlCommand interactionCmd = null;
SqlCommand articleCmd = null;
SqlCommand linkCmd = null;
SqlCommand drugCmd = null;
SqlCommand idCmd = null;
SqlCommand mixtureCmd = null;
SqlCommand packagerCmd = null;
SqlCommand priceCmd = null;
SqlCommand categoryCmd = null;
SqlCommand organismCmd = null;
SqlCommand patentCmd = null;
SqlCommand sequenceCmd = null;
SqlCommand propertyCmd = null;
SqlCommand identifierCmd = null;
SqlCommand enzymCmd = null;
public UploadXml(string filename)
{
string connStr = DrugBank.Properties.Settings.Default.DrugBankConnectionString;
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
drugCmd = new SqlCommand(INSERT_DRUG, conn);
drugCmd.Parameters.Add("@Type", SqlDbType.VarChar, 20);
drugCmd.Parameters.Add("@Created", SqlDbType.DateTime);
drugCmd.Parameters.Add("@Updated", SqlDbType.DateTime);
drugCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
drugCmd.Parameters.Add("@Name", SqlDbType.VarChar, 50);
drugCmd.Parameters.Add("@Description", SqlDbType.VarChar);
drugCmd.Parameters.Add("@Case_Number", SqlDbType.VarChar, 20);
drugCmd.Parameters.Add("@Unii", SqlDbType.VarChar, 20);
drugCmd.Parameters.Add("@State", SqlDbType.VarChar, 20);
drugCmd.Parameters.Add("@Synthesis_reference", SqlDbType.VarChar, 1024);
drugCmd.Parameters.Add("@Indication", SqlDbType.VarChar);
drugCmd.Parameters.Add("@Pharmacodynamics", SqlDbType.VarChar, 1024);
drugCmd.Parameters.Add("@Mechanism_of_Action", SqlDbType.VarChar, 1024);
drugCmd.Parameters.Add("@Toxicity", SqlDbType.VarChar, 1024);
drugCmd.Parameters.Add("@Metabolism", SqlDbType.VarChar);
drugCmd.Parameters.Add("@Absorption", SqlDbType.VarChar, 1024);
drugCmd.Parameters.Add("@Half_Life", SqlDbType.VarChar, 256);
drugCmd.Parameters.Add("@Protein_Binding", SqlDbType.VarChar, 64);
drugCmd.Parameters.Add("@Route_of_Elimination", SqlDbType.VarChar);
drugCmd.Parameters.Add("@Volume_of_Distribution", SqlDbType.VarChar);
drugCmd.Parameters.Add("@Clearance", SqlDbType.VarChar);
idCmd = new SqlCommand(INSERT_DRUG_ID, conn);
idCmd.Parameters.Add("@ID", SqlDbType.VarChar, 256);
idCmd.Parameters.Add("@ALT_ID", SqlDbType.VarChar, 20);
articleCmd = new SqlCommand(INSERT_DRUG_ARTICLE, conn);
articleCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
articleCmd.Parameters.Add("@Pubmed_ID", SqlDbType.VarChar, 256);
articleCmd.Parameters.Add("@Citation", SqlDbType.VarChar, 20);
linkCmd = new SqlCommand(INSERT_DRUG_LINK, conn);
linkCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
linkCmd.Parameters.Add("@Title", SqlDbType.VarChar, 256);
linkCmd.Parameters.Add("@URL", SqlDbType.VarChar, 64);
interactionCmd = new SqlCommand(INSERT_DRUG_INTERACTION, conn);
interactionCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
interactionCmd.Parameters.Add("@Interaction_ID", SqlDbType.VarChar, 20);
interactionCmd.Parameters.Add("@Description", SqlDbType.VarChar, 256);
productCmd = new SqlCommand(INSERT_DRUG_PRODUCT, conn);
productCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@Name", SqlDbType.VarChar, 128);
productCmd.Parameters.Add("@Labeller", SqlDbType.VarChar, 64);
productCmd.Parameters.Add("@NDC_ID", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@NDC_Product_Code", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@DPD_ID", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@EMA_Product_Code", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@EMA_MA_Number", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@Started_Marketing_On", SqlDbType.DateTime2, 20);
productCmd.Parameters.Add("@Ended_Marketing_On", SqlDbType.DateTime2, 20);
productCmd.Parameters.Add("@Dosage_Form", SqlDbType.VarChar, 64);
productCmd.Parameters.Add("@Strength", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@Route", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@FDA_Application_Number", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@Generic", SqlDbType.Bit);
productCmd.Parameters.Add("@Over_the_Counter", SqlDbType.Bit);
productCmd.Parameters.Add("@Approved", SqlDbType.Bit);
productCmd.Parameters.Add("@Country", SqlDbType.VarChar, 20);
productCmd.Parameters.Add("@Source", SqlDbType.VarChar, 20);
mixtureCmd = new SqlCommand(INSERT_DRUG_MIXTURE, conn);
mixtureCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
mixtureCmd.Parameters.Add("@Name", SqlDbType.VarChar, 64);
mixtureCmd.Parameters.Add("@Ingredients", SqlDbType.VarChar, 64);
packagerCmd = new SqlCommand(INSERT_DRUG_PACKAGER, conn);
packagerCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
packagerCmd.Parameters.Add("@Name", SqlDbType.VarChar, 64);
packagerCmd.Parameters.Add("@URL", SqlDbType.VarChar, 64);
priceCmd = new SqlCommand(INSERT_DRUG_PRICE, conn);
priceCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
priceCmd.Parameters.Add("@Description", SqlDbType.VarChar, 128);
priceCmd.Parameters.Add("@Cost", SqlDbType.Decimal);
priceCmd.Parameters.Add("@Currency", SqlDbType.VarChar,20);
priceCmd.Parameters.Add("@Unit", SqlDbType.VarChar, 20);
categoryCmd = new SqlCommand(INSERT_DRUG_CATEGORY, conn);
categoryCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
categoryCmd.Parameters.Add("@Category", SqlDbType.VarChar, 128);
categoryCmd.Parameters.Add("@Mesh_ID", SqlDbType.VarChar, 20);
organismCmd = new SqlCommand(INSERT_DRUG_ORGANISM, conn);
organismCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
organismCmd.Parameters.Add("@Organism", SqlDbType.VarChar, 128);
patentCmd = new SqlCommand(INSERT_DRUG_PATENT, conn);
patentCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
patentCmd.Parameters.Add("@Number", SqlDbType.VarChar, 20);
patentCmd.Parameters.Add("@Country", SqlDbType.VarChar, 20);
patentCmd.Parameters.Add("@Approved", SqlDbType.DateTime2);
patentCmd.Parameters.Add("@Expires", SqlDbType.DateTime2);
patentCmd.Parameters.Add("@Pediatric_Extension", SqlDbType.Bit);
sequenceCmd = new SqlCommand(INSERT_DRUG_SEQUENCE, conn);
sequenceCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
sequenceCmd.Parameters.Add("@Format", SqlDbType.VarChar, 20);
sequenceCmd.Parameters.Add("@Sequence", SqlDbType.VarChar);
sequenceCmd.Parameters.Add("@Type", SqlDbType.VarChar, 20);
propertyCmd = new SqlCommand(INSERT_DRUG_PROPERTY, conn);
propertyCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
propertyCmd.Parameters.Add("@Kind", SqlDbType.VarChar, 20);
propertyCmd.Parameters.Add("@Value", SqlDbType.VarChar, 20);
propertyCmd.Parameters.Add("@Source", SqlDbType.VarChar, 20);
identifierCmd = new SqlCommand(INSERT_DRUG_IDENTIFIER, conn);
identifierCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
identifierCmd.Parameters.Add("@Resource", SqlDbType.VarChar, 64);
identifierCmd.Parameters.Add("@Identifier", SqlDbType.VarChar, 64);
enzymCmd = new SqlCommand(INSERT_DRUG_ENZYM, conn);
enzymCmd.Parameters.Add("@ID", SqlDbType.VarChar, 20);
enzymCmd.Parameters.Add("@UniprotID", SqlDbType.VarChar, 20);
XmlReader reader = XmlReader.Create(filename);
while (!reader.EOF)
{
if (reader.Name != "drug")
{
reader.ReadToFollowing("drug");
}
if (!reader.EOF)
{
XElement drug = (XElement)XElement.ReadFrom(reader);
string primaryID = (string)drug.Elements().Where(x => (x.Name.LocalName == "drugbank-id") && (x.Attribute("primary") != null)).FirstOrDefault();
AddDrug(conn, drug, primaryID);
AddArticles(conn, drug, primaryID);
AddInteractions(conn, drug, primaryID);
AddProducts(conn, drug, primaryID);
AddMixtures(conn, drug, primaryID);
AddPackagers(conn, drug, primaryID);
AddPrices(conn, drug, primaryID);
AddCategories(conn, drug, primaryID);
AddOrganisms(conn, drug, primaryID);
AddPatents(conn, drug, primaryID);
AddSequences(conn, drug, primaryID);
AddProperties(conn, drug, primaryID);
AddIdentifiers(conn, drug, primaryID);
AddEnzymes(conn, drug, primaryID);
}
}
}
Я действительно удивился, получив CosnoleApplication под номером 43! действительно здорово, теперь я пытаюсь бежать и изучать это.
Какой формат? Какие дочерние элементы? Я просматриваю только первые 1000 строк загруженного мною xml. Разместите нужный вам раздел Xml.
Можно ли продолжить чат, чтобы отправить часть XML?
Это drugbank.ca/docs/drugbank.xsd У каждого лекарства есть идентификатор и взаимодействие с наркотиками, которые я хочу записать на консоли. простите меня, потому что я занимаюсь медициной.
Я обновил код оконного приложения Form и поместил результаты в datagridview.
Я многому научился из вашего кода, у меня есть одна проблема. как я могу представить все сведения о наркотиках в виде таблицы данных? Я имею ввиду другой детский наркотик?
Добавьте больше столбцов в DataTable. Затем добавьте дополнительные элементы в каждую строку. Это усложняется, если у вас есть несколько дочерних элементов как для дополнительного элемента, так и для взаимодействий. Я как бы решил это с помощью идентификаторов, поместив данные CSV для идентификаторов в одну ячейку. Перед переходом в цикл foreach вам может потребоваться использовать Descendants для получения дочерних данных.
Каких детей вы хотите добавить?
хороший ответ, 8 дней работы над ответом, нет прогресса из-за недостатка знаний, можно ли добавить всех детей? тут есть какие-то сложные детские упреки, я не мог поставить это на DG! не могли бы вы, пожалуйста, файл XSD? Помоги мне, пожалуйста.
Я добавил продукты в таблицу в качестве примера. Лучше сделать это с помощью нескольких таблиц или создания базы данных. Слишком много повторяющейся информации, чтобы повторяться в каждой строке таблицы данных. у продуктов есть разные сильные стороны, и добавлять каждую силу не имеет особого смысла, когда вы ищете взаимодействия.
как я могу использовать несколько таблиц? Я должен спросить это еще раз? Мне нужна дополнительная информация. Есть ли какой-нибудь пример, который можно добавить в свой ответ? Мне нужно больше дополнительной информации в дополнение к взаимодействию.
Я имею в виду извлечь всю информацию из этого XML в DG.
Я всегда советую людям создавать структуры таблиц классов перед написанием кода. Затем выполните несколько типовых тестов, чтобы убедиться, что конструкции соответствуют вашим требованиям. Если вам нужен DG, создайте DG и определите, какие привязки вам нужны. Затем создайте объекты, чтобы сделать привязки. Вы не работали над дизайном, просто спешите писать код.
Я исследую ваш комментарий, но это сложно сделать. не могли бы вы показать мне, как я могу извлечь всю информацию (все дочерние элементы) из этого файла? для меня это очень важно. Я не мог понять суть из файла XSD.
Невозможно извлечь всю информацию в один DataTable и получить что-нибудь читабельное. Сделайте проектную работу по разделению информации в полезный формат, который люди смогут использовать, а затем я помогу.
Ваш хороший ответ, я приложил много усилий, чтобы извлечь всю информацию. Я обновляю вопрос и добавляю красивую структуру xml.
Что хорошего в новой структуре? Это все еще очень сложно, и вы еще не разбили его на удобочитаемую структуру. Предположим, пациент попал в отделение неотложной помощи с передозировкой. Какая информация понадобится врачу, чтобы быстро вылечить пациента, не читая все повторяющиеся имена и названия производителей? Также может быть ссылка, чтобы врач мог идентифицировать таблетку (форма, размер, идентификационный номер) с дозировкой.
jdweng, Это касалось исследования по фармакологии. Мне нужно извлечь все данные, это так сложно. не могли бы вы мне помочь? некоторые усилия могут привести к новому расследованию в области лекарств или фармакологии.
Есть два разных способа действия: 1) Загрузить в базу данных SQL. Затем подключитесь к базе данных на C#. 2) Используйте сериализацию XML и загрузите в классы. Первый способ лучше, потому что эти данные остаются в базе данных. Второй способ. Вам придется загружать xml каждый раз при запуске приложения.
Действительно, возможно ли (1)? Не могли бы вы продолжить исследования в нашей лаборатории? потому что мы медицинская бригада, а не профессия. у нас есть один технический специалист, но мы не эксперт в таких банках, как вы. нет подробностей о вашей биографии для подключения.
Я надеюсь, что ваши технические знания помогут нам получить достаточно информации из этого сложного банка.
Добавлена таблица товаров.
System.NullReferenceException: 'Ссылка на объект не установлена на экземпляр объекта.' Строка оператора System.Xml.Linq.XElement.explicit вернула значение null. в этой строке строка state = ((string) drug.Elements (). Где (x => x.Name.LocalName == "state"). FirstOrDefault ()). Trim ();
Это странная ошибка через 2 минуты после запуска.
Я тестировал код только с 4 препаратами. Я подозревал, что мы можем получить эту ошибку, когда протестировали полную базу данных. Похоже, что у одного из препаратов есть тег состояния, поэтому, когда происходит Trim (), вы получаете исключение. Когда я тестировал, я замечаю, что в начале и конце некоторых текстовых сообщений xml были лишние пробелы. добавил обрезку, но знал, что если у некоторых препаратов нет тегов, это исключение может произойти. Вы можете удалить обрезку, но убедитесь, что вы запускаете сценарий SQL перед запуском C#. Многократный запуск C# поместит повторяющиеся данные в базу данных. Падение в sql удаляет старые данные.
Я убрал заявления об обрезке там, где они не были критическими. Они нужны для идентификаторов и там, где вам может потребоваться поиск предметов. Если пробелы остались, вам может потребоваться использовать «like» с% при выполнении запросов к базе данных.
Я знаю, что есть очень плохой банк. при первом запуске произошла другая ошибка: System.Data.SqlClient.SqlException: «Строковые или двоичные данные будут усечены. Заявление было прекращено.' в сети: drugCmd.ExecuteNonQuery ();
Длины полей некоторых строк недостаточно велики, чтобы решить проблему. В схеме не указаны размеры. Не хотел делать базу данных больше, чем необходимо, поэтому предположил размер и предположил, что она слишком мала.
Получил, чтобы загрузить все 11 033 лекарства. Я обновил SQL и C#.
Я заметил, что описания были обрезаны до 1024, в одном было более 5000 символов, поэтому я исправил это. Также изменил код так, чтобы он находился в собственном классе.
Название продукта состояло всего из 20 символов, поэтому я сделал его 128.
очень хорошо. Думаю, это справочный ответ. Я пытаюсь преобразовать всю информацию о лекарстве в xml и добавить один. моя работа не такая быстрая, как у вас, но я надеюсь, что смогу добавлять и использовать в наших исследованиях и улучшать работы для всего мира.
Я знаю, что вы не свободны, но попробуйте завершить его в свободное время, это может быть справочный ответ SO. спасибо за вашу помощь в улучшении знаний в мирах.
Есть ли способ заполнить таблицу или нет?
Я заполнил большую часть таблицы (ов). Похоже, что в разных разделах есть повторяющаяся информация, которую я не включил. Существует ограничение в 3000 символов, поэтому у меня есть три ответа. Один для верхней части кода, один для методов и один для SQL-запроса.
Вот вторая часть кода:
public void AddDrug(SqlConnection conn, XElement drug, string primaryID)
{
string dType = ((string)drug.Attribute("type")).Trim();
DateTime created = (DateTime)drug.Attribute("created");
DateTime updated = (DateTime)drug.Attribute("updated");
List<XElement> drugbank_ids = drug.Elements().Where(x => (x.Name.LocalName == "drugbank-id") && (x.Attribute("primary") != null)).ToList();
string name = ((string)drug.Elements().Where(x => x.Name.LocalName == "name").FirstOrDefault()).Trim();
foreach (string drugbank_id in drugbank_ids)
{
idCmd.Parameters["@ID"].Value = primaryID;
idCmd.Parameters["@ALT_ID"].Value = drugbank_id;
idCmd.ExecuteNonQuery();
}
string description = ((string)drug.Elements().Where(x => x.Name.LocalName == "description").FirstOrDefault()).Trim();
int za = description.Length;
string case_number = ((string)drug.Elements().Where(x => x.Name.LocalName == "cas-number").FirstOrDefault());
int zb = case_number.Length;
string unii = ((string)drug.Elements().Where(x => x.Name.LocalName == "unii").FirstOrDefault());
int zc = unii.Length;
string state = (drug.Elements().Where(x => x.Name.LocalName == "state").FirstOrDefault() == null) ? "" : ((string)drug.Elements().Where(x => x.Name.LocalName == "state").FirstOrDefault()).Trim();
int zd = state.Length;
string synthesis_reference = ((string)drug.Elements().Where(x => x.Name.LocalName == "synthesis-reference").FirstOrDefault());
int ze = synthesis_reference.Length;
string indication = ((string)drug.Elements().Where(x => x.Name.LocalName == "indication").FirstOrDefault());
int zf = indication.Length;
string pharmacodynamics = ((string)drug.Elements().Where(x => x.Name.LocalName == "pharmacodynamics").FirstOrDefault());
int zg = pharmacodynamics.Length;
string mechanism_of_action = ((string)drug.Elements().Where(x => x.Name.LocalName == "mechanism-of-action").FirstOrDefault());
int zh = mechanism_of_action.Length;
string toxicity = ((string)drug.Elements().Where(x => x.Name.LocalName == "toxicity").FirstOrDefault());
int zi = toxicity.Length;
string metabolism = ((string)drug.Elements().Where(x => x.Name.LocalName == "metabolism").FirstOrDefault());
int zj = metabolism.Length;
string absorption = ((string)drug.Elements().Where(x => x.Name.LocalName == "absorption").FirstOrDefault());
int zk = absorption.Length;
string half_life = ((string)drug.Elements().Where(x => x.Name.LocalName == "half-life").FirstOrDefault());
int zl = half_life.Length;
string protein_binding = ((string)drug.Elements().Where(x => x.Name.LocalName == "protein-binding").FirstOrDefault());
int zm = protein_binding.Length;
string route_of_elimination = ((string)drug.Elements().Where(x => x.Name.LocalName == "route-of-elimination").FirstOrDefault());
int zn = route_of_elimination.Length;
string volume_of_distribution = ((string)drug.Elements().Where(x => x.Name.LocalName == "volume-of-distribution").FirstOrDefault());
int zo = volume_of_distribution.Length;
string clearance = ((string)drug.Elements().Where(x => x.Name.LocalName == "clearance").FirstOrDefault());
int zp = clearance.Length;
drugCmd.Parameters["@Type"].Value = dType;
drugCmd.Parameters["@Created"].Value = created;
drugCmd.Parameters["@Updated"].Value = updated;
drugCmd.Parameters["@ID"].Value = primaryID;
drugCmd.Parameters["@Name"].Value = name;
drugCmd.Parameters["@Description"].Value = description;
drugCmd.Parameters["@Case_Number"].Value = case_number;
drugCmd.Parameters["@Unii"].Value = unii;
drugCmd.Parameters["@State"].Value = state;
drugCmd.Parameters["@Synthesis_Reference"].Value = synthesis_reference;
drugCmd.Parameters["@Indication"].Value = indication;
drugCmd.Parameters["@Pharmacodynamics"].Value = pharmacodynamics;
drugCmd.Parameters["@Mechanism_of_Action"].Value = mechanism_of_action;
drugCmd.Parameters["@Toxicity"].Value = toxicity;
drugCmd.Parameters["@Metabolism"].Value = metabolism;
drugCmd.Parameters["@Absorption"].Value = absorption;
drugCmd.Parameters["@Half_Life"].Value = half_life;
drugCmd.Parameters["@Protein_Binding"].Value = protein_binding;
drugCmd.Parameters["@Route_of_Elimination"].Value = route_of_elimination;
drugCmd.Parameters["@Volume_of_Distribution"].Value = volume_of_distribution;
drugCmd.Parameters["@Clearance"].Value = clearance;
drugCmd.ExecuteNonQuery();
}
public void AddArticles(SqlConnection conn, XElement drug, string id)
{
foreach (XElement article in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("article")))
{
string pubmed_id = ((string)article.Elements().Where(XElement => XElement.Name.LocalName == "pubmed-id").FirstOrDefault());
string citation = ((string)article.Elements().Where(XElement => XElement.Name.LocalName == "citation").FirstOrDefault());
articleCmd.Parameters["@ID"].Value = id;
articleCmd.Parameters["@Pubmed_ID"].Value = pubmed_id;
articleCmd.Parameters["@Citation"].Value = citation;
articleCmd.ExecuteNonQuery();
}
foreach (XElement article in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("link")))
{
string title = ((string)article.Elements().Where(XElement => XElement.Name.LocalName == "title").FirstOrDefault());
string url = ((string)article.Elements().Where(XElement => XElement.Name.LocalName == "url").FirstOrDefault());
linkCmd.Parameters["@ID"].Value = id;
linkCmd.Parameters["@Title"].Value = title;
linkCmd.Parameters["@URL"].Value = url;
linkCmd.ExecuteNonQuery();
}
}
public void AddInteractions(SqlConnection conn, XElement drug, string id)
{
foreach (XElement interaction in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("drug-interaction")))
{
string interactionID = ((string)interaction.Elements().Where(XElement => XElement.Name.LocalName == "drugbank-id").FirstOrDefault()).Trim();
string description = ((string)interaction.Elements().Where(XElement => XElement.Name.LocalName == "description").FirstOrDefault());
interactionCmd.Parameters["@ID"].Value = id;
interactionCmd.Parameters["@Interaction_ID"].Value = interactionID;
interactionCmd.Parameters["@Description"].Value = description;
interactionCmd.ExecuteNonQuery();
}
}
public void AddProducts(SqlConnection conn, XElement drug, string id)
{
foreach (XElement product in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("product")))
{
string name = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "name").FirstOrDefault()).Trim();
string labeller = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "labeller").FirstOrDefault()).Trim();
string ndc_id = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "ndc-id").FirstOrDefault());
string ndc_product_code = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "ndc-product-code").FirstOrDefault());
string dpd_id = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "dpd-id").FirstOrDefault());
string ema_product_code = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "ema-product-code").FirstOrDefault());
string ema_ma_number = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "ema-ma-number").FirstOrDefault());
string started_marketing_onStr = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "started-marketing-on").FirstOrDefault());
string ended_marketing_onStr = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "ended-marketing-on").FirstOrDefault());
string dosage_form = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "dosage-form").FirstOrDefault());
string strength = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "strength").FirstOrDefault());
string route = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "route").FirstOrDefault());
string fda_application_number = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "fda-application-number").FirstOrDefault());
string genericStr = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "generic").FirstOrDefault());
byte? generic = string.IsNullOrEmpty(genericStr) ? null : ((genericStr == "true") ? (byte?)1 : (byte?)0);
string over_the_counterStr = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "over-the-counter").FirstOrDefault());
byte? over_the_counter = string.IsNullOrEmpty(over_the_counterStr) ? null : ((over_the_counterStr == "true") ? (byte?)1 : (byte?)0);
string approvedStr = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "approved").FirstOrDefault());
byte? approved = string.IsNullOrEmpty(approvedStr) ? null : ((approvedStr == "true") ? (byte?)1 : (byte?)0);
string country = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "country").FirstOrDefault());
string source = ((string)product.Elements().Where(XElement => XElement.Name.LocalName == "source").FirstOrDefault());
productCmd.Parameters["@ID"].Value = id;
productCmd.Parameters["@Name"].Value = name;
productCmd.Parameters["@Labeller"].Value = labeller;
productCmd.Parameters["@NDC_ID"].Value = ndc_id;
productCmd.Parameters["@NDC_Product_Code"].Value = ndc_product_code;
productCmd.Parameters["@DPD_ID"].Value = dpd_id;
productCmd.Parameters["@EMA_Product_Code"].Value = ema_product_code;
productCmd.Parameters["@EMA_MA_Number"].Value = ema_ma_number;
if (!string.IsNullOrEmpty(started_marketing_onStr))
{
productCmd.Parameters["@Started_Marketing_On"].Value = DateTime.Parse(started_marketing_onStr);
}
else
{
productCmd.Parameters["@Started_Marketing_On"].Value = new DateTime();
}
if (!string.IsNullOrEmpty(ended_marketing_onStr))
{
productCmd.Parameters["@Ended_Marketing_On"].Value = DateTime.Parse(ended_marketing_onStr);
}
else
{
productCmd.Parameters["@Ended_Marketing_On"].Value = new DateTime();
}
productCmd.Parameters["@Dosage_Form"].Value = dosage_form;
productCmd.Parameters["@Strength"].Value = strength;
productCmd.Parameters["@Route"].Value = route;
productCmd.Parameters["@FDA_Application_Number"].Value = fda_application_number;
productCmd.Parameters["@Generic"].Value = generic;
productCmd.Parameters["@Over_the_Counter"].Value = over_the_counter;
productCmd.Parameters["@Approved"].Value = approved;
productCmd.Parameters["@Country"].Value = country;
productCmd.Parameters["@Source"].Value = source;
productCmd.ExecuteNonQuery();
}
}
public void AddMixtures(SqlConnection conn, XElement drug, string id)
{
foreach (XElement mixture in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("mixture")))
{
string name = ((string)mixture.Elements().Where(XElement => XElement.Name.LocalName == "name").FirstOrDefault()).Trim();
string ingredient = ((string)mixture.Elements().Where(XElement => XElement.Name.LocalName == "ingredients").FirstOrDefault()).Trim();
mixtureCmd.Parameters["@ID"].Value = id;
mixtureCmd.Parameters["@Name"].Value = name;
mixtureCmd.Parameters["@Ingredients"].Value = ingredient;
mixtureCmd.ExecuteNonQuery();
}
}
public void AddPackagers(SqlConnection conn, XElement drug, string id)
{
foreach (XElement packager in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("packager")))
{
string name = ((string)packager.Elements().Where(XElement => XElement.Name.LocalName == "name").FirstOrDefault()).Trim();
string url = ((string)packager.Elements().Where(XElement => XElement.Name.LocalName == "url").FirstOrDefault()).Trim();
packagerCmd.Parameters["@ID"].Value = id;
packagerCmd.Parameters["@Name"].Value = name;
packagerCmd.Parameters["@URL"].Value = url;
packagerCmd.ExecuteNonQuery();
}
}
public void AddPrices(SqlConnection conn, XElement drug, string id)
{
foreach (XElement price in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("price")))
{
string description = ((string)price.Elements().Where(XElement => XElement.Name.LocalName == "description").FirstOrDefault()).Trim();
XElement xCost = (price.Elements().Where(XElement => XElement.Name.LocalName == "cost").FirstOrDefault());
string cost = ((string)xCost).Trim();
string currency = (string)xCost.Attribute("currency");
string unit = ((string)price.Elements().Where(XElement => XElement.Name.LocalName == "unit").FirstOrDefault()).Trim();
priceCmd.Parameters["@ID"].Value = id;
priceCmd.Parameters["@Description"].Value = description;
priceCmd.Parameters["@Cost"].Value = cost;
priceCmd.Parameters["@Currency"].Value = currency;
priceCmd.Parameters["@Unit"].Value = unit;
priceCmd.ExecuteNonQuery();
}
}
public void AddCategories(SqlConnection conn, XElement drug, string id)
{
XElement categories = drug.Descendants().Where(XElement => XElement.Name.LocalName == ("categories")).FirstOrDefault();
foreach (XElement xCategory in categories.Elements().Where(XElement => XElement.Name.LocalName == ("category")))
{
string category = ((string)xCategory.Elements().Where(XElement => XElement.Name.LocalName == "category").FirstOrDefault()).Trim();
string meshID = ((string)xCategory.Elements().Where(XElement => XElement.Name.LocalName == "mesh-id").FirstOrDefault()).Trim();
categoryCmd.Parameters["@ID"].Value = id;
categoryCmd.Parameters["@Category"].Value = category;
categoryCmd.Parameters["@Mesh_ID"].Value = meshID;
categoryCmd.ExecuteNonQuery();
}
}
public void AddOrganisms(SqlConnection conn, XElement drug, string id)
{
foreach (XElement xOrganism in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("affected-organism")))
{
string organism = ((string)xOrganism).Trim();
organismCmd.Parameters["@ID"].Value = id;
organismCmd.Parameters["@Organism"].Value = organism;
organismCmd.ExecuteNonQuery();
}
}
public void AddPatents(SqlConnection conn, XElement drug, string id)
{
foreach (XElement patent in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("patent")))
{
string number = ((string)patent.Elements().Where(XElement => XElement.Name.LocalName == "number").FirstOrDefault()).Trim();
string country = ((string)patent.Elements().Where(XElement => XElement.Name.LocalName == "country").FirstOrDefault()).Trim();
DateTime approved = (DateTime)patent.Elements().Where(XElement => XElement.Name.LocalName == "approved").FirstOrDefault();
DateTime expires = (DateTime)patent.Elements().Where(XElement => XElement.Name.LocalName == "expires").FirstOrDefault();
string pediatric_extensionStr = ((string)patent.Elements().Where(XElement => XElement.Name.LocalName == "pediatric-extension").FirstOrDefault());
byte? pediatric_extension = string.IsNullOrEmpty(pediatric_extensionStr) ? null : ((pediatric_extensionStr == "true") ? (byte?)1 : (byte?)0);
patentCmd.Parameters["@ID"].Value = id;
patentCmd.Parameters["@Number"].Value = number;
patentCmd.Parameters["@Country"].Value = country;
patentCmd.Parameters["@Approved"].Value = approved;
patentCmd.Parameters["@Expires"].Value = expires;
patentCmd.Parameters["@Pediatric_Extension"].Value = pediatric_extension;
patentCmd.ExecuteNonQuery();
}
}
public void AddSequences(SqlConnection conn, XElement drug, string id)
{
string format = "";
string sequence = "";
foreach (XElement xSequence in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("sequence")))
{
format = (string)xSequence.Attribute("format");
sequence = ((string)xSequence).Trim();
sequenceCmd.Parameters["@ID"].Value = id;
sequenceCmd.Parameters["@Format"].Value = format == null ? "" : format;
sequenceCmd.Parameters["@Type"].Value = "sequence";
sequenceCmd.Parameters["@Sequence"].Value =sequence;
sequenceCmd.ExecuteNonQuery();
}
XElement amino_acid_sequence = drug.Descendants().Where(XElement => XElement.Name.LocalName == ("amino-acid-sequence")).FirstOrDefault();
if (amino_acid_sequence != null)
{
format = (string)amino_acid_sequence.Attribute("format");
sequence = ((string)amino_acid_sequence).Trim();
sequenceCmd.Parameters["@ID"].Value = id;
sequenceCmd.Parameters["@Format"].Value = format;
sequenceCmd.Parameters["@Type"].Value = "amino-acid-sequence";
sequenceCmd.Parameters["@Sequence"].Value = sequence;
sequenceCmd.ExecuteNonQuery();
}
XElement gene_sequence = drug.Descendants().Where(XElement => XElement.Name.LocalName == ("gene-sequence")).FirstOrDefault();
if (gene_sequence != null)
{
format = (string)gene_sequence.Attribute("format");
sequence = ((string)gene_sequence).Trim();
sequenceCmd.Parameters["@ID"].Value = id;
sequenceCmd.Parameters["@Format"].Value = format;
sequenceCmd.Parameters["@Type"].Value = "gene_sequence";
sequenceCmd.Parameters["@Sequence"].Value = sequence;
sequenceCmd.ExecuteNonQuery();
}
}
public void AddProperties(SqlConnection conn, XElement drug, string id)
{
foreach (XElement property in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("property")))
{
string kind = ((string)property.Elements().Where(XElement => XElement.Name.LocalName == "kind").FirstOrDefault()).Trim();
string value = ((string)property.Elements().Where(XElement => XElement.Name.LocalName == "value").FirstOrDefault()).Trim();
string source = ((string)property.Elements().Where(XElement => XElement.Name.LocalName == "source").FirstOrDefault()).Trim();
propertyCmd.Parameters["@ID"].Value = id;
propertyCmd.Parameters["@Kind"].Value = kind;
propertyCmd.Parameters["@Value"].Value = value;
propertyCmd.Parameters["@Source"].Value = source;
propertyCmd.ExecuteNonQuery();
}
}
public void AddIdentifiers(SqlConnection conn, XElement drug, string id)
{
foreach (XElement xIdentifier in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("external-identifier")))
{
string resource = ((string)xIdentifier.Elements().Where(XElement => XElement.Name.LocalName == "resource").FirstOrDefault()).Trim();
string identifier = ((string)xIdentifier.Elements().Where(XElement => XElement.Name.LocalName == "identifier").FirstOrDefault()).Trim();
identifierCmd.Parameters["@ID"].Value = id;
identifierCmd.Parameters["@Resource"].Value = resource;
identifierCmd.Parameters["@Identifier"].Value = identifier;
identifierCmd.ExecuteNonQuery();
}
}
public void AddEnzymes(SqlConnection conn, XElement drug, string id)
{
foreach (XElement enzyme in drug.Descendants().Where(XElement => XElement.Name.LocalName == ("uniprot-id")))
{
string uniprot_id = (string)enzyme;
enzymCmd.Parameters["@ID"].Value = id;
enzymCmd.Parameters["@UniprotID"].Value = uniprot_id;
enzymCmd.ExecuteNonQuery();
}
}
}
Вот сценарий SQL:
Create Database DrugBank
;
GO
Use DrugBank
drop table Drugs
drop table IDs
drop table Articles
drop table Links
drop table Interactions
drop table Products
drop table Mixtures
drop table Packagers
drop table Prices
drop table Categories
drop table Organisms
drop table Patents
drop table Sequences
drop table Properties
drop table Identifiers
drop table Enzymes
;
GO
CREATE TABLE Drugs (
type varchar(20) NULL,
Created datetime NULL,
Updated datetime NULL,
ID varchar(20) primary key,
Name varchar(50) NULL,
Description varchar(max) NULL,
[Case Number] varchar(20) NULL,
Unii varchar(20) NULL,
State varchar(20) NULL,
[Synthesis Reference] varchar(1024) NULL,
Indication varchar(max) NULL,
Pharmacodynamics varchar(1024) NULL,
[Mechanism Of Action] varchar(1024) NULL,
Toxicity varchar(1024) NULL,
Metabolism varchar(max) NULL,
Absorption varchar(1024) NULL,
[Half Life] varchar(256) NULL,
[Protein Binding] varchar(64) NULL,
[Route of Eelimination] varchar(max) NULL,
[Volume of Distribution] varchar(max) NULL,
Clearance varchar(max) NULL
)
CREATE TABLE IDs
(
ID varchar(20),
[ALT ID] varchar(20)
)
CREATE TABLE Articles
(
ID varchar(20),
[Pubmed ID] varchar(20) NULL,
[Citation] varchar(1024) NULL
)
CREATE TABLE Links
(
ID varchar(20),
[Title] varchar(256) NULL,
[URL] varchar(64) NULL
)
CREATE TABLE Interactions
(
ID varchar(20),
[Interaction ID] varchar(20) NULL,
[Description] varchar(1024) NULL,
)
CREATE TABLE Products
(
[ID] varchar(20),
[Name] varchar(128) NULL,
[Labeller] varchar(64) NULL,
[NDC ID] varchar(20) NULL,
[NDC Product Code] varchar(20) NULL,
[DPD ID] varchar(20) NULL,
[EMA Product Code] varchar(20) NULL,
[EMA MA Number] varchar(20) NULL,
[Started Marketing On] date NULL,
[Ended Marketing On] date NULL,
[Dosage Form] varchar(64) NULL,
[Strength] varchar(20) NULL,
[Route] varchar(20) NULL,
[FDA Application Number] varchar(20) NULL,
[Generic] bit NULL,
[Over the Counter] bit NULL,
[Approved] bit NULL,
[Country] varchar(20) NULL,
[Source] varchar(20) NULL,
)
CREATE TABLE Mixtures
(
[ID] varchar(20),
[Name] varchar(64),
[ingredients] varchar(64) NULL,
)
CREATE TABLE Packagers
(
[ID] varchar(20),
[Name] varchar(64),
[URL] varchar(64) NULL,
)
CREATE TABLE Prices
(
[ID] varchar(20),
[Description] varchar(128),
[Cost] decimal NULL,
[Currency] varchar(20),
[Unit] varchar(20),
)
CREATE TABLE Categories
(
[ID] varchar(20),
[Category] varchar(128),
[Mesh ID] varchar(20),
)
CREATE TABLE Organisms
(
[ID] varchar(20),
[Organism] varchar(128),
)
CREATE TABLE Patents
(
[ID] varchar(20),
[Number] varchar(20),
[Country] varchar(20),
[Approved] datetime2,
[Expires] datetime,
[Pediatric Extension] bit,
)
CREATE TABLE Sequences
(
[ID] varchar(20),
[Format] varchar(20),
[Type] varchar(20),
[Sequence] varchar(max),
)
CREATE TABLE Properties
(
[ID] varchar(20),
[Kind] varchar(64),
[Value] varchar(32),
[Source] varchar(128)
)
CREATE TABLE Identifiers
(
[ID] varchar(20),
[Resource] varchar(64),
[identifier] varchar(64)
)
CREATE TABLE Enzymes
(
[ID] varchar(20),
[UniprotID] varchar(20)
)
Как далеко вы продвинулись с кодом
XmlReader? вы можете просто вызватьRead, пока не найдете правильное имя узла ...?