2013-06-27 7 views
3

"name"다음에 오는 모든 노드 값을 가져 오려고합니다. 하지만 그것은 낭트 xmlpeek XML에서 하나의 노드를 얻을 수있는 것 같습니다. "이름"뒤에 모든 노드를 가져 오는 다른 방법이 있습니까?Nant에서 xmlpeek를 사용하여 여러 xml 노드를 얻으려면 어떻게해야합니까?

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> 

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

nant 스크립트 :

<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"으로)

감사합니다.

답변

1

<xmlpeek> 작업은 내가 알 수있는 한 여러 결과를 반환하도록 설계되지 않았습니다.

XPath 표현식이 반환되는 노드의 텍스트를 결정하는 데 사용되는 노드 인덱스가 입니다 여러 노드를 지정하는 경우 : 공식 설명에 따르면.

신뢰할 수있는 동일한 이름의 노드 수를 확인하는 경우 해당 노드에 <foreach> 루프를 실행 해 볼 수 있습니다. 그렇지 않으면, 당신이 가진 유일한 대안은 이것을위한 맞춤 NAnt 작업을 만드는 것이라고 생각합니다. nant.contrib 프로젝트는 내가 볼 수있는 한이 목적을 위해 아무 것도 가지고 있지 않습니다. 마찬가지로 얀은 말했다

<target name="get.xml.nodes"> 
    <property name="counter" value="1" if="${not property::exists(counter)}" /> 
    <property name="counter" value="${counter + 1}" if="${property::exists(counter)}" /> 

    <property name="temp" value="${node}" if="${property::exists(node)}"/> 

    <xmlpeek file="file.xml" nodeindex="${counter}" xpath="/node" property="node" failonerror="false" /> 

    <call target="get.xml.nodes" unless="${node == temp}" /> 
<target> 

, 당신이 기술적으로이 작업을 수행 할 수 있다고 생각하지 않습니다 및 <foreach> 실제로이 기능을 지원하지 않습니다

1

내 유일한 제안은 재귀 "루프"입니다. LoopItems은 파일, 폴더, 라인 또는 문자열 일 수 있습니다.

+0

많은 고통을 겪은 후 upvoting 후, 위의 해결책은 nAnt .85 이상에서는 작동하지 않는다는 것을 발견했습니다. 재발 할 수있는 능력은 .85 RC에서 삭제되었으며 결코 복원되지 않았습니다. http://sourceforge.net/p/nant/bugs/275/를 참조하십시오. – user1821052

0

@sirdank의 대답은 가장 우아하지만 nAnt 버전 .85 이상에서는 작동하지 않습니다. 여기에 같은 작업을 수행하는 NANT의 단순 혼합 및 임베디드 VB.net입니다 감안할 때 : 당신이 큰 파일이있는 경우 당신은 아마 VB 코드에서 XPath에 함께 갈 것을

<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> 

참고.