将Visual Studio项目文件解析为XML

Jus*_*elf 2 c# xml dynamic-language-runtime project-files visual-studio-2012

使用动态xml解析器,我正在尝试将VS Project文件作为XElement加载.这是项目文件的精简版:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
    </ItemGroup>
    <ItemGroup>
    </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

该文件似乎加载的意义是当我ToString()时,我得到了内容.但是,在尝试挑选元素时,找不到任何东西:

XElement element;

public DynamicXmlParser( string fileName )
{
    element = XElement.Load( fileName );
}

public override bool TryGetMember( GetMemberBinder binder, out object result )
{
    result = null;
    if ( element == null ) return false;

    XElement subElement = element.Element( binder.Name );

    if ( subElement == null ) return false;

    result = new DynamicXmlParser( subElement );
    return true;
}
Run Code Online (Sandbox Code Playgroud)

subElement始终为null.

binder.NameItemGroup

dynamic xmlDoc = new DynamicXmlParser( SampleFileName );
Debug.Pring(xmlDoc.ItemGroup.ToString());
Run Code Online (Sandbox Code Playgroud)

但是,当我从Project节点中删除所有属性时,subElement将按预期变为ItemGroup XElement.

当属性在项目节点中时,为什么我可以返回任何元素?

Paw*_*wel 5

您可能要求空命名空间中的元素为什么实际上元素存在于xmlns ="http://schemas.microsoft.com/developer/msbuild/2003"中.看看XNamespace.

比如试试:

XNamespace msbuildNs = "http://schemas.microsoft.com/developer/msbuild/2003"
XElement subElement = element.Element(msbuildNs + binder.Name);
Run Code Online (Sandbox Code Playgroud)