문제
려고 노력해요 아주 기본적인 XPath 에 이 xml (아래),그리고 그것은 하지 않습니다.내가 노력하고있다.물 이 웹사이트, 고 Xpath 등 //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()='PropertyGroup']
//*[name()='MSBuildCommunityTasksPath']
편집: 네임스페이스대 고 나는 그들은 중요하지 않지만,와일드카드 그들에게 편리할 때 cobbling 함께 시제품 코드,one-off 데스크탑 도구와 실험,XSLT 등도 있습니다.의 균형의 편의를 위해 필요한에 대해 허용 가능한 위험에 대한 작업을 손에 있습니다.참고로,필요한 경우,당신은 또한 스트립 또는 할당 네임스페이스입니다.
다른 팁
태그에 이 문서 끝에 있는"기본"네임스페이스에 의해 만들어 xmlns 특성 없는 접두어.불행하게도,XPath 혼자 할 수 없습 쿼리에 있는 요소 기본 네임스페이스가 있습니다.나는 실제로는 확실하지 않의 의미 정보,하지만 당신은 명시적으로 첨부하여 접두사하는 네임스페이스을 사용하여 어떤 도구 호스팅 XPath.
이 있을 수 있습 짧은 방법이다.순 있지만,유일한 방법은 본를 통해 NameSpaceManager.후에 당신은 명시적으로의 네임스페이스를 추가할 수 있습 쿼리를 사용하는 네임스페이스 관리자로 모든 범주에서는 네임스페이스의 요소가는 접두어(I'을 선택했 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 특성하"//PropertyGroup"XPath 작동합니다.는 방법을 쿼리와 네임스페이스는 일반적으로 포함싱 기본 xmlns 을 식별자(때문에 하나를 지정하지 않는 특성에서)선택하여 다음과 같"//myXMLNStoken:PropertyGroup".