Что хороший путь состоит в том, чтобы найти определенным значением в XML-документе с помощью C#?

попробуйте это

$nameTemplate="prefix_";

        $tableNames = \Schema::getConnection()->getDoctrineSchemaManager()->listTableNames();

        foreach ($tableNames as $tableNameValue) 
        {
            if (strpos($tableNameValue, $nameTemplate) !== false) 
            {
                dd('table found in serach criteria ');
            }
            else
            {
                dd('table not found in serach criteria ');
            }

        }
6
задан Jon Skeet 17 December 2008 в 14:47
поделиться

6 ответов

Я лично использовал бы LINQ для XML, потому что я нахожу это легче иметь дело с, чем XPath, особенно когда пространства имен включены. Вы сделали бы что-то как:

XNamespace ns0 = "http://dev1/MyWebService1.wsdl";

String result = doc.Descendants(ns0 + "result").First().Value;

Отметьте это doc здесь, как ожидают, будет XDocument, не XmlDocument. (Мое предположение - то, что это - то, почему это не собиралось для Вас.)

15
ответ дан 8 December 2019 в 04:10
поделиться

fwiw можно обмануть проблему пространства имен с xpath как это: //*[local-name()='result']

5
ответ дан 8 December 2019 в 04:10
поделиться

Если Вы не хотите идти для Linq, Вы могли бы использовать XPathDocument для получения значения:

XPathDocument xmldoc = new XPathDocument(@"C:\tmp\sample.xml");
XPathNavigator nav = xmldoc.CreateNavigator();

XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace("ns0", "http://dev1/MyWebService1.wsdl");

XPathNavigator result = nav.SelectSingleNode("//ns0:result", nsMgr);
System.Diagnostics.Debug.WriteLine(result.Value);

XPathDocument имеет более низкий объем потребляемой памяти и скорее всего быстрее в Вашем сценарии, чем XmlDocument. XmlDocument создает полную объектную модель Вашего XML-документа в памяти, тогда как XPathDocument не делает этого.

3
ответ дан 8 December 2019 в 04:10
поделиться

Первое, что пришло на ум следующее должно работать:

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;

XmlNamespaceManager mgr = GetNamespace(doc);
doc.LoadXml(xmltext);

XmlNode nd = doc.DocumentElement.SelectSingleNode("//ns0:result", mgr);

Код пространства имен похож на это:

private XmlNamespaceManager GetNamespace(XmlDocument document)
{
    XmlNamespaceManager mgr = new XmlNamespaceManager(document.NameTable);
    mgr.AddNamespace("ns0", "http://dev1/MyWebService1.wsdl");
    return mgr;
}

Необходимо использовать менеджера по пространству имен, потому что XML-документу связали пространства имен с ним, и XPath использует это в разрешении запроса.

2
ответ дан 8 December 2019 в 04:10
поделиться

Для решения этого я использовал ответ Jon Skeet. Вот код, который я должен был реализовать для создания этой работы (для чьего-либо еще будущего преимущества).

XmlDocument xmlDoc = new XmlDocument();

XNamespace ns0 = "http://dev1/MyWebService1.wsdl";

xmlDoc.Load(request.GetResponse().GetResponseStream());

XDocument xDoc = XDocument.Load(new XmlNodeReader(xmlDoc));                          

String result = xDoc.Descendants(ns0 + "result").First().Value;

Это, конечно, предполагает, что я возвращаю свой ответ из HttpWebRequest, названного запросом.

1
ответ дан 8 December 2019 в 04:10
поделиться

Существуют очень хорошие и полные ответы на этот вопрос.

Я добавил бы только из любопытства, что чрезвычайно простое выражение XPath делает задание в данном случае:

   normalize-space(/)

Это легко сделано в C# с помощью чего-то как эти две строки ниже:

        XPathNavigator navigator = document.CreateNavigator();

        string res = (string)navigator.Evaluate("normalize-space(/)");

С хорошей оптимизацией механизма XPath.NET его оценка может даже быть эффективной.

0
ответ дан 8 December 2019 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: