我相信这应该只能使用标准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,它将为我提供当前节点下的所有苹果节点,无论它们在当前节点下的深度如何?具体来说,根据我上面的例子,我应该得到三个结果 - 红色,绿色和黄色的苹果.
所以我正在修改一个多项目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#中链接构造函数时如何更改执行顺序.我见过的唯一方法需要在当前构造函数之外首先调用链式构造函数.
具体来说,请参考以下示例:
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)