小编Sea*_*rle的帖子

XPath选择具有指定名称的所有元素

我相信这应该只能使用标准XPath来回答,而不需要参考实现,但仅供参考我在.Net(System.Xml命名空间)中使用XML DOM对象.

我有一个节点从一个XML文档深处的某个地方传递给我的函数,我想选择具有特定名称的该节点的所有后代元素,而不管这些节点的中间路径.我正在制作的电话看起来像这样:

node.SelectNodes("some XPath here");
Run Code Online (Sandbox Code Playgroud)

我正在使用的节点看起来像这样:

...
<food>
  <tart>
    <apple color="yellow"/>
  </tart>
  <pie>
    <crust quality="flaky"/>
    <filling>
      <apple color="red"/>
    </filling>
  </pie>
  <apple color="green"/>
</food>
...
Run Code Online (Sandbox Code Playgroud)

我想要的是所有"苹果"节点的列表,即3个结果.我尝试过几种不同的东西,但没有一种能得到我想要的东西.

node.SelectNodes("apple");
Run Code Online (Sandbox Code Playgroud)

这给了我一个结果,绿苹果.

node.SelectNodes("*/apple");
Run Code Online (Sandbox Code Playgroud)

这给了我一个结果,黄色的苹果.

node.SelectNodes("//apple");
Run Code Online (Sandbox Code Playgroud)

这给了我数百个结果,看起来像文档中的每个苹果节点,或者至少可能是文档根目录的直接子节点的每个苹果节点.

如何创建一个XPath,它将为我提供当前节点下的所有苹果节点,无论它们在当前节点下的深度如何?具体来说,根据我上面的例子,我应该得到三个结果 - 红色,绿色和黄色的苹果.

.net xml xpath

27
推荐指数
1
解决办法
5万
查看次数

如何在VSTemplate中创建评估的自定义参数

所以我正在修改一个多项目VS模板(Visual Studio项目模板),我想在根模板中设置一个自定义参数供子模板使用.但是,我想根据现有参数进行设置.

所以,例如,这工作正常:

<CustomParameter Name="$FaultProject$" Value="MyProject.FaultContracts"/>

变量$ FaultProject $由MyProject.FaultContracts替换,应该是.

但是,这不起作用:

<CustomParameter Name="$FaultProject$" Value="$safeprojectname$.FaultContracts"/>

我希望$ safeprojectname $被正确的值替换,但事实并非如此.相反,变量$ FaultProject $被$ safeprojectname $ .FaultContracts取代.$ safeprojectname $被解释为文字而不是它的参数.

尽管如此,在同一个文件中,这与预期完全一致:

<ProjectTemplateLink ProjectName="$safeprojectname$.FaultContracts">WCFFaultContract\FaultContract.vstemplate</ProjectTemplateLink>

任何想法都会有所帮助.我相信我可能会编写一个IWizard类来执行此操作,但如果可能的话,我宁愿避免使用这样一个简单的函数.

或者,如果我可以获得一个包含根模板$ safeprojectname $的值的参数,那也可以解决我的需求(在子模板中,$ safeprojectname $更改为子项目的名称,而不是值在根模板中).

c# parameters templates visual-studio-templates

10
推荐指数
1
解决办法
1682
查看次数

C#构造函数链接 - 更改执行顺序

我想知道在C#中链接构造函数时如何更改执行顺序.我见过的唯一方法需要在当前构造函数之外首先调用链式构造函数.

具体来说,请参考以下示例:

public class Foo {
  private static Dictionary<string, Thing> ThingCache = new Dictionary<string, Thing>();
  private Thing myThing;

  public Foo(string name) {
    doSomeStuff();
    if (ThingCache.ContainsKey(name)) {
      myThing = ThingCache[name];
    } else {
      myThing = ExternalStaticFactory.GetThing(name);
      ThingCache.Add(name, myThing);
    }
    doSomeOtherStuff();
  }

  public Foo(Thing tmpThing) {
    doSomeStuff();
    myThing = tmpThing;
    doSomeOtherStuff();
  }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望通过这样做来减少代码重复(请注意,我承认在这个人为的示例中,没有保存太多代码,但我正在使用可以获得更多好处的代码.为了清楚起见,我使用此示例):

public class Foo {
  private static Dictionary<string, Thing> ThingCache = new Dictionary<string, Thing>();
  private Thing myThing;

  public Foo(string name) {
    if (ThingCache.ContainsKey(name)) {
      this(ThingCache[name]);
    } else {
      this(ExternalStaticFactory.GetThing(name)); …
Run Code Online (Sandbox Code Playgroud)

c# constructor constructor-chaining

6
推荐指数
2
解决办法
6759
查看次数