попробуйте это
$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 ');
}
}
Я лично использовал бы LINQ для XML, потому что я нахожу это легче иметь дело с, чем XPath, особенно когда пространства имен включены. Вы сделали бы что-то как:
XNamespace ns0 = "http://dev1/MyWebService1.wsdl";
String result = doc.Descendants(ns0 + "result").First().Value;
Отметьте это doc
здесь, как ожидают, будет XDocument
, не XmlDocument
. (Мое предположение - то, что это - то, почему это не собиралось для Вас.)
fwiw можно обмануть проблему пространства имен с xpath как это: //*[local-name()='result']
Если Вы не хотите идти для 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 не делает этого.
Первое, что пришло на ум следующее должно работать:
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 использует это в разрешении запроса.
Для решения этого я использовал ответ 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, названного запросом.
Существуют очень хорошие и полные ответы на этот вопрос.
Я добавил бы только из любопытства, что чрезвычайно простое выражение XPath делает задание в данном случае:
normalize-space(/)
Это легко сделано в C# с помощью чего-то как эти две строки ниже:
XPathNavigator navigator = document.CreateNavigator();
string res = (string)navigator.Evaluate("normalize-space(/)");
С хорошей оптимизацией механизма XPath.NET его оценка может даже быть эффективной.