Что случилось с моим XPath/XML?

Вот адаптация Swift 3 ответа Кабреры :

let bundle = Bundle.main
        let path = bundle.path(forResource: "GoogleService-Info", ofType: "plist")!
        let options = FIROptions.init(contentsOfFile: path)
        FIRApp.configure(withName: "Secondary", options: options!)
        let secondary_app = FIRApp.init(named: "Secondary")
        let second_auth = FIRAuth(app : secondary_app!)
        second_auth?.createUser(withEmail: self.username.text!, password: self.password.text!)
        {
            (user,error) in
            print(user!.email!)
            print(FIRAuth.auth()?.currentUser?.email ?? "default")
        }

10
задан Wayne Burkett 20 December 2011 в 19:46
поделиться

3 ответа

Можно добавить пространства имен в коде и всем этом, но Вы можете эффективно подстановочный знак пространство имен. Попробуйте следующую идиому XPath.

//*[local-name()='PropertyGroup']
//*[local-name()='MSBuildCommunityTasksPath']

имя () обычно работает также, как в:

//*[name()='PropertyGroup']
//*[name()='MSBuildCommunityTasksPath']

Править: Пространства имен являются большими, и я не предполагаю, что они не важны, но wildcarding их пригождается, чиня опытный код, одноразовые настольные инструменты, экспериментируя с XSLT, и т.д. Сбалансируйте свою потребность в удобстве против приемлемого риска для задачи под рукой. К вашему сведению, если потребуется, можно также разделить или повторно присвоить пространства имен.

15
ответ дан 3 December 2019 в 20:45
поделиться

Ваша проблема с пространством имен (xmlns = "http://schemas.microsoft.com/developer/msbuild/2003"). Вы получаете нулевые узлы, потому что Вы не квалифицируете его с пространством имен. При удалении атрибута xmlns "//, PropertyGroup" XPath будет работать. Как Вы запрашиваете с пространством имен, обычно включает искажение значения по умолчанию xmlns к идентификатору (так как каждый не указан на атрибуте), и выбирающий как "//myXMLNStoken:PropertyGroup".

1
ответ дан 3 December 2019 в 20:45
поделиться

Теги в документе заканчиваются в пространстве имен "по умолчанию", созданном атрибутом xmlns без префикса. К сожалению, один только XPath не может элементы запроса в пространстве имен по умолчанию. Я на самом деле не уверен в семантических деталях, но необходимо явно присоединить префикс к тому пространству имен с помощью любого инструмента, размещает XPath.

Может быть более короткий способ сделать это в.NET, но единственный способ, которым я видел, через NameSpaceManager. После явного добавления пространства имен можно запросить использование менеджера по пространству имен, как будто все теги в namespaced элементе имеют тот префикс (я выбрал 'msbuild'):

using System;
using System.Xml;

public class XPathNamespace {
    public static void Main(string[] args) {
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(
    @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
    <!-- $Id: FxCop.proj 114 2006-03-14 06:32:46Z pwelter34 $ -->

    <PropertyGroup>
        <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\bin\Debug</MSBuildCommunityTasksPath>
    </PropertyGroup>

    <Import Project=""$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\MSBuild.Community.Tasks.Targets""/>

    <Target Name=""DoFxCop"">

        <FxCop 
            TargetAssemblies=""$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll""
            RuleLibraries=""@(FxCopRuleAssemblies)"" 
            AnalysisReportFileName=""Test.html""
            DependencyDirectories=""$(MSBuildCommunityTasksPath)""
            FailOnError=""True""
            ApplyOutXsl=""True""
            OutputXslFileName=""C:\Program Files\Microsoft FxCop 1.32\Xml\FxCopReport.xsl""
        />
    </Target>

</Project>");

        XmlNamespaceManager namespaceManager = new
    XmlNamespaceManager(xmlDocument.NameTable);
        namespaceManager.AddNamespace("msbuild", "http://schemas.microsoft.com/developer/msbuild/2003");
        foreach (XmlNode n in xmlDocument.SelectNodes("//msbuild:MSBuildCommunityTasksPath", namespaceManager)) {
            Console.WriteLine(n.InnerText);
        }
    }
}
2
ответ дан 3 December 2019 в 20:45
поделиться
Другие вопросы по тегам:

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