Я пытаюсь немного очистить приложение C#.
Я пытаюсь получить доступ к 4 частям информации на следующей странице: https://smstestbed.nist.gov/vds/current
В следующей функции я запрашиваю поток данных в реальном времени с удаленного обрабатывающего инструмента. Моя проблема заключается в том, что, хотя я смог напечатать CreationTime на терминале, мое использование XPath ужасно неуклюже, и, поскольку Эта ссылка, кажется, предполагает, что я должен иметь возможность делать то, что я делаю, в двух строках после моего комментарий
«// Это должен быть гораздо лучший способ доступа к данным, но по какой-то причине вторая строка не работает»
К сожалению, я получаю Доступность Узел was Null.
public static void PollNIST()
{
string NISTSourceURL = "https://smstestbed.nist.gov/vds/current"; // Gives us a human friendly reference to the HTM
//-------------------------------- Current (mostly) Working Version---------------------------------------------------------------------------------
// Retrieve raw HTML
var NISTTargetURL = NISTSourceURL;
var NISTHttpClient = new HttpClient();
var NISTXMLRaw = NISTHttpClient.GetStringAsync(NISTTargetURL); // We now have all of the HTML / XML Data as a raw string
//Console.WriteLine(MazXMLRaw.Result); // Prints the resulting HTML to a terminal as a debug tool (Works)
XmlDocument CurNISTXML = new XmlDocument(); // Generate Blank XML Doc
CurNISTXML.LoadXml(NISTXMLRaw.Result); // This (".result") passes the actual string?, should then be loaded into new XML file
var elementHeader = CurNISTXML.GetElementsByTagName("Header");
var curNISTHeader = elementHeader.Item(0);
var creationTime = curNISTHeader.Attributes[0]; // We actually have the creationTime
string CurNISTTime = creationTime.InnerText; ; // //*[@id = "mtconnect content"]/ul/li[1]
//This should be a far better way of accessing the data but for some reason the second line fails
XmlNode AvailabilityNode = CurNISTXML.SelectSingleNode("/table[1]/tbody/tr[1]"); //*[@id = "mtconnect content"]/table[1]/tbody/tr[1]/td[7] // Xpath Availability
var CurNISTStatus = AvailabilityNode.InnerText; // //*[@id = "mtconnect content"]/ul/li[1]
string CurNistX = ""; // //*[@id = "mtconnect content"]/table[5]/tbody/tr/td[7]
string CurNistY = ""; // //*[@id = "mtconnect content"]/table[6]/tbody/tr/td[7]
Console.WriteLine("-------BEGIN NIST DATA PACKET-------");
Console.WriteLine("NIST Time : " + creationTime.InnerText);
Console.WriteLine("NIST Status: " + CurNISTStatus);
Console.WriteLine("NIST X Pos.: " + CurNistX);
Console.WriteLine("NIST Y Pos.: " + CurNistY);
Console.WriteLine("--------END NIST DATA PACKET--------");
//var currentNIST = new NISTDataSet()// Create new instance ofNISTdata object
}
Любые идеи?
Вы уверены? Если я распечатаю XML-документ для консоли, все будет готово, и время создания будет работать нормально.
Я впервые пишу на C#, поэтому я зацикливаюсь на вещах, которые, вероятно, довольно просты.
Какую xml-ссылку вы используете? То, что вы разместили, - это только html.
Метка времени получается только при использовании ссылки, указанной в первой строке метода.
Когда я просматриваю исходный код, кажется, что ссылка, заканчивающаяся «/ vds / current», - это путь к XML?
У smstestbed есть расположение схемы в верхней части файла xml. Получите схему из местоположения. Затем используйте инструмент msdn xsd.exe для преобразования XML в классы (параметр / cl / l: cs). Затем используйте сериализацию xml для анализа данных.
Перейдите по URL-адресу в браузере. XML-файл начинается с: <? Xml version = "1.0" encoding = "UTF-8"?>
Есть идеи, как я могу напрямую обращаться к XML?
Думаю, я перепутал «источник просмотра» и «проверить». Когда я нажимаю "Просмотр источника", я вижу только XML.
Когда я делаю Console.WriteLine (CurNistXML.InnerXML); я получаю то, что начинается с <? XML version = 1.0 .... "
Содержит ли xml тег «Заголовок» [CurNISTXML.GetElementsByTagName («Заголовок»);]. Я думаю, что xml встроен в Html. Тег заголовка является частью HTML и не существует в Xml.





Выражение XPath
/table[1]/tbody/tr[1]
будет успешным только в том случае, если самый внешний элемент документа - это элемент table, что кажется маловероятным. Я не пытался понять логику страницы или вашего кода, но это определенно выглядит неправильно. «/» в начале выражения пути выбирает из корня дерева.
Да, я так и думал, я пробовал несколько разных вещей, поэтому думаю, что там есть одна косая черта.
@GigaJoules Выбирает ли '// table [1] / tbody / tr [1]' то, что вы хотели? Мне непонятно, какой элемент вы пытаетесь выбрать.
@GigaJoules Мы видим много вопросов, в которых люди разбросали случайные знаки препинания вокруг своих выражений XPath в надежде, что они будут действовать как волшебная волшебная пыль. Это редко бывает эффективной стратегией. Сэкономьте время, прочтите инструкцию.
Я хочу вытащить слово «доступный» из верхней правой ячейки первой таблицы и «значение» количества таблиц «линейный x» и «линейный y»
В конце концов, использование идентификатора атрибута было гораздо лучшим вариантом, поскольку каждый элемент имеет уникальный идентификатор и встречается только один раз.
Итак, оказалось, что нет ничего плохого в том, как я извлекал XML, только с моими путями.
public static void PollNIST()
{
string NISTSourceURL = "https://smstestbed.nist.gov/vds/current"; // Gives us a human friendly reference to the HTMl
// string NistXmlUrl = // Someone on stackexchange is claiming that there is another url for the XML but viewsource says otherwise
//-------------------------------- Current (mostly) Working Version---------------------------------------------------------------------------------
var NISTHttpClient = new HttpClient();
var NISTXMLRaw = NISTHttpClient.GetStringAsync(NISTSourceURL); // We now have all of the HTML / XML Data as a raw string
//Console.WriteLine(MazXMLRaw.Result); // Prints the resulting HTML to a terminal as a debug tool (Works)
XmlDocument CurNISTXML = new XmlDocument(); // Generate Blank XML Doc
CurNISTXML.LoadXml(NISTXMLRaw.Result); // This (".result") passes the actual string?, should then be loaded into new XML file
// Get CreationTime (WORKING!)
XmlNodeList elementHeader = CurNISTXML.GetElementsByTagName("Header");
XmlNode curNISTHeader = elementHeader.Item(0);
XmlAttribute creationTime = curNISTHeader.Attributes[0]; // We now have the creationTime element
string CurNISTTime = creationTime.InnerText; // //*[@id = "mtconnect content"]/ul/li[1]
// Get availability (WORKING!)
XmlNodeList nodeAvailability = CurNISTXML.GetElementsByTagName("Availability");
XmlNode availability = nodeAvailability.Item(0); // I think this is maybe a bit of a hackish / improper way to do this?
string curNISTStatus = availability.InnerText;
//Get linear tool X Coord.
XmlNodeList deviceStream = CurNISTXML.GetElementsByTagName("ComponentStream");
XmlNode linearCompXStream = deviceStream.Item(4);
string curNISTX = linearCompXStream.InnerText; // We do not need to break down the nodes any further as the value is the only text within
//Get Linear tool y Coord.
XmlNode linearCompYStream = deviceStream.Item(5);
string curNISTY = linearCompYStream.InnerText; // We do not need to break down the nodes any further as the value is the only text within
Console.WriteLine("-------BEGIN NIST DATA PACKET-------");
Console.WriteLine("NIST Time : " + creationTime.InnerText);
Console.WriteLine("NIST Status: " + curNISTStatus);
Console.WriteLine("NIST X Pos.: " + curNISTX);
Console.WriteLine("NIST Y Pos.: " + curNISTY);
Console.WriteLine("--------END NIST DATA PACKET--------");
//var currentNIST = new NISTDataSet()// Create new instance ofNISTdata object
}
работает хорошо.
Вы пытаетесь разобрать html-страницу с помощью xml. Вы используете неправильный URL. Данные доступны в формате XML, но вам нужно использовать другой URL. См .: nist.gov/programs-projects/materials-data-curation-system