Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XPath / 3 сообщений из 3, страница 1 из 1
05.05.2017, 11:47
    #39449273
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath
Коллеги, день добрый. Чот завтыкал, не могу понять, почему не работают xpath выражения.
Есть вот такой файлик:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{9FE2A8A4-504E-4DD0-A3EF-6AAAD04AC37D}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>ProjectModify</RootNamespace>
    <AssemblyName>ProjectModify</AssemblyName>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
    <Reference Include="Test2">
      <HintPath>..\Test2\bin\Debug\Test2.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Include="App.config" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Test1\Test1.csproj">
      <Project>{b6936758-bf33-4a01-860a-a7b9491a32bd}</Project>
      <Name>Test1</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
</Project>


хочу получить список ItemGroup. Загружаю файл так:
Код: c#
1.
2.
var doc = new XmlDocument();
doc.Load(filePath);


Пробовал следующее:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
//в doc.InnerXml лежит весь xml файл, ну т.е. его содержимое
doc.SelectNodes("//Project/ItemGroup");
doc.SelectNodes("/Project/ItemGroup");
doc.SelectNodes("Project/ItemGroup");

//в doc.DocumentElement.InnerXml лежит все содержимое блока Project
doc.DocumentElement.SelectNodes("//ItemGroup");
doc.DocumentElement.SelectNodes("/ItemGroup");
doc.DocumentElement.SelectNodes("ItemGroup");



В doc.DocumentElement.ChildNodes лежат теги Import, PropertyGroup, ItemGroup. Не могу понять, почему XPath не работает, есть у кого какие идеи?
...
Рейтинг: 0 / 0
05.05.2017, 15:56
    #39449498
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath
Какие тут идеи, всё и так понятно - у корневого элемент объявлен дефолтный неймспейс, узлы внутри него принадлежат этому неймспейсу, и в XPath'е должны адресоваться через этот неймспейс:
Код: c#
1.
2.
3.
var xnsm = new XmlNamespaceManager(xd.NameTable);
xnsm.AddNamespace("msbuild", "http://schemas.microsoft.com/developer/msbuild/2003");
Console.WriteLine(xd.SelectNodes("/msbuild:Project/msbuild:ItemGroup", xnsm).Count);


- 4 узла.
...
Рейтинг: 0 / 0
05.05.2017, 16:05
    #39449509
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath
Сон Веры ПавловныКакие тут идеи, всё и так понятно - у корневого элемент объявлен дефолтный неймспейс, узлы внутри него принадлежат этому неймспейсу, и в XPath'е должны адресоваться через этот неймспейс:
Код: c#
1.
2.
3.
var xnsm = new XmlNamespaceManager(xd.NameTable);
xnsm.AddNamespace("msbuild", "http://schemas.microsoft.com/developer/msbuild/2003");
Console.WriteLine(xd.SelectNodes("/msbuild:Project/msbuild:ItemGroup", xnsm).Count);


- 4 узла.
Спасибо большое! Не знал про неймспейсы
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XPath / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]