سؤال

أحاول تشغيل XPath أساسي جدًا هذا ملف XML (كما هو موضح أدناه)، ولم يجد أي شيء.أحاول كلاً من .NET و هذا الموقع, و XPaths مثل //PropertyGroup, /PropertyGroup و //MSBuildCommunityTasksPath ببساطة لا تعمل بالنسبة لي (لقد قاموا بتجميع النتائج ولكنهم لم يعودوا بأي نتائج).

مصدر XML:

<?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>
هل كانت مفيدة؟

المحلول

يمكنك إضافة مساحات أسماء في التعليمات البرمجية الخاصة بك وكل ذلك، ولكن يمكنك حرف بدل مساحة الاسم بشكل فعال.جرب لغة XPath التالية.

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

name() عادةً ما يعمل أيضًا، كما في:

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

يحرر: مساحات الأسماء رائعة وأنا لا أقترح أنها ليست مهمة، ولكن استخدام أحرف البدل لها يكون مفيدًا عند تجميع كود النموذج الأولي، وأدوات سطح المكتب لمرة واحدة، وتجربة XSLT، وما إلى ذلك.قم بموازنة حاجتك إلى الراحة مقابل المخاطر المقبولة للمهمة التي تقوم بها.لمعلوماتك، إذا لزم الأمر، يمكنك أيضًا تجريد مساحات الأسماء أو إعادة تعيينها.

نصائح أخرى

تنتهي العلامات الموجودة في المستند في مساحة الاسم "الافتراضية" التي تم إنشاؤها بواسطة السمة xmlns بدون بادئة.لسوء الحظ، XPath وحده لا يمكنه الاستعلام عن العناصر الموجودة في مساحة الاسم الافتراضية.لست متأكدًا في الواقع من التفاصيل الدلالية، ولكن يتعين عليك إرفاق بادئة بشكل صريح بمساحة الاسم هذه باستخدام أي أداة تستضيف XPath.

قد تكون هناك طريقة أقصر للقيام بذلك في .NET، ولكن الطريقة الوحيدة التي رأيتها هي عبر NameSpaceManager.بعد إضافة مساحة اسم بشكل صريح، يمكنك الاستعلام باستخدام مدير مساحة الاسم كما لو كانت جميع العلامات الموجودة في عنصر مساحة الاسم تحتوي على تلك البادئة (اخترت '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);
        }
    }
}

مشكلتك تتعلق بمساحة الاسم (xmlns="http://schemas.microsoft.com/developer/msbuild/2003").أنت لا تتلقى أي عقد لأنك لا تؤهلها بمساحة الاسم.إذا قمت بإزالة سمة xmlns، فسيعمل XPath "//PropertyGroup" الخاص بك.عادةً ما تتضمن كيفية الاستعلام باستخدام مساحة الاسم اسم مستعار لملف xmlns الافتراضي لمعرف (نظرًا لعدم تحديد واحد في السمة)، واختيار مثل "//myXMLNStoken:PropertyGroup".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top