3

「名前」の後の名前であるすべてのノードの値を取得したい。しかし、Nant xmlpeek は xml から 1 つのノードしか取得できないようです。「名前」の後にあるすべてのノードを取得する他の方法はありますか?

xml ファイル:

<?xml version="1.0" encoding="utf-8" ?>
<QAEnvironment xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <user>
                <name value="clientA" />
        <name value="clientB" />
        <name value="clientC" />
        <name value="clientD" />
    </user>
</QAEnvironment>

================================================== ============================

ナントスクリプト:

<xmlpeek
    file="A.xml"
    xpath="/x:QAEnvironment/x:user/x:name/@value"
    property="clientName"
    nodeindex="3">
     <namespaces>
        <namespace prefix="x" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
    </namespaces> 
    <echo message="clientName: ${clientName}" />
</xmlpeek>

================================================== ============================== 結果 - clientName: clientD (nodindex = "3" として)

ありがとう

4

3 に答える 3

1

<xmlpeek>私が知る限り、このタスクは複数の結果を返すようには設計されていません。その公式の説明によると:

XPath 式で複数のノードが指定されている場合、ノード インデックスを使用して、どのノードのテキストが返されるかが決定されます。

同じ名前のノードの数を決定する信頼できる方法がある場合は、<foreach>それらに対してループを実行してみることができます。それ以外の場合、唯一の代替手段は、このためのカスタム NAnt タスクを作成することだと思います。私が見る限り、nant.contrib プロジェクトにはこの目的のためのものは何もありません。

于 2013-06-27T08:58:52.667 に答える
0

@sirdank による回答は最もエレガントですが、nAnt バージョン .85 以降では機能しません。それを考えると、同じことを達成する Nant と組み込みの VB.net の単純な組み合わせを次に示します。

<target name="parseNodes">


   <script language="VB">
     <references> 
<include name="System.dll" /> 
<include name="System.Xml.dll" /> 
     </references> 
     <imports> 
       <import namespace="System.Text.RegularExpressions" /> 
       <import namespace="System.Xml" /> 
       <import namespace="System.Xml.XPath" /> 
     </imports> 
     <code><![CDATA[

public shared sub ScriptMain(thisProject as Project)
    Dim xmlDoc as new XmlDocument()
    Dim nodes as XmlNodeList
    Dim packageString as string

    xmlDoc.Load(thisProject.properties("path"))

    nodes = xmlDoc.GetElementsByTagName("myNode")

    for each node as XmlNode in nodes
        nodeString += package.Attributes.itemOf("someAttribute").value & ","    
    next

    thisProject.properties("nodes") = nodeString

 end sub

     ]]>
     </code>
   </script>


   <echo message="Nodes: ${nodes}" />       

<foreach item="String" in="${nodes}" delim="," property="node">
        <echo message="${node}" />
</foreach>


 </target>

ファイルが大きい場合は、おそらく VB コードで XPath を使用する必要があることに注意してください。

于 2015-12-03T22:19:16.827 に答える