2014-10-14 7 views
0

XML 문서를 구문 분석하여 다른 시스템으로로드하는 중입니다. 나는 렌치를 사물에 던진 XML 파일에 관한 문제를 조사했습니다.어린이 선택

은 XML 파일은 다음과 같습니다

<gel:script 
xmlns:core="jelly:core" 
xmlns:j="jelly.core" 
xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary" 
xmlns:x="jelly:org.apache.commons.jelly.tags.xml.XMLTagLibrary" 
xmlns:util="jelly:util" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<!-- ************************************************************* --> 
<!-- Program: Parse XML Application        --> 
<!-- ************************************************************ --> 
<gel:log message="Start Xml File Parse Test" /> 
<x:parse var="RemoveNameSpace"> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/> 
     <xsl:template match="*"> 
      <xsl:element name="{local-name()}"> 
       <xsl:apply-templates select="@* | node()"/> 
      </xsl:element> 
     </xsl:template> 
     <xsl:template match="@*"> 
      <xsl:attribute name="{local-name()}"> 
       <xsl:value-of select="."/> 
      </xsl:attribute> 
     </xsl:template> 
     <xsl:template match="comment() | text() | processing-instruction()"> 
      <xsl:copy/> 
     </xsl:template> 
    </xsl:stylesheet> 
</x:parse> 
<x:parse var="xmlRawData" xml="file:///C:/Users/admin/Desktop/Application.xml" /> 
<x:transform var="xmlData" xml= "${xmlRawData}" xslt="${RemoveNameSpace}" /> 
<gel:log message="${xmlData.asXML()}" /> 
<gel:parse var="gelXmlData"> 
    <x:transform xml= "${xmlRawData}" xslt="${RemoveNameSpace}" /> 
</gel:parse> 
<gel:set asString="true" select="$gelXmlData//Application/SubmissionHeader/Name/text()" var="Name"/> 
<gel:set asString="true" select="$gelXmlData//Application/@Forms/text()" var="Budget"/> 
<gel:log> 
    Name = ${Name} 
    Budget = ${Budget} 
</gel:log> 
</gel:script> 
:

<Project:Application 
xmlns:Budget="http://com.gff/Budget" 
xmlns:Budget1="http://com.gff/Budget123" 
xmlns:Project="http://com.gff/Project" 
xmlns:header="http://com.gff/Header"> 
<header:SubmissionHeader> 
    <header:Name>Application Name</header:Name> 
    <header:Number>PRJ12345</header:Number> 
    <header:Title>XML File Parse</header:Title> 
</header:SubmissionHeader> 
<Project:Forms> 
    <Budget123:Budget123> 
     <Budget1:ID>12345</Budget1:ID> 
     <Budget1:Type>Project A</Budget1:Type> 
    </Budget123:Budget123> 
    <Budget123:Budget123> 
     <Budget1:ID>6789</Budget1:ID> 
     <Budget1:Type>Project B</Budget1:Type> 
    </Budget123:Budget123> 
    <Budget123:Budget123> 
     <Budget1:ID></Budget1:ID> 
     <Budget1:Type>Project C</Budget1:Type> 
    </Budget123:Budget123> 
</Project:Forms> 
다음

내가 내 응용 프로그램에 웹 서비스를 통해 변수와 부하로 데이터를 던져 실행하고 코드입니다

문제는 예산 섹션에서 각 파일의 이름이 다르게 표시되는 것입니다. 예를 들어,이 파일의 노드 이름은 Budget123이고 다음 파일은 Budget10이며 다음 파일은 Budget_12입니다. 네임 스페이스가 왜 그런지에 대해서는 운이나 이유가없는 것처럼 보입니다. 값을 얻기 위해 경로를 하드 코드하기보다는 나무를 걷고, 각 노드를 가져 와서 변수에 넣고, 변수의 이름을 값으로 바꾸기를 원합니다.

나는 시도했다 :

//Application/Forms/*[starts-with(local-name(),'Budget')] 

문제는 그 반환 :

<Budget123:Budget123> 
     <Budget1:ID>12345</Budget1:ID> 
     <Budget1:Type>Project A</Budget1:Type> 
    </Budget123:Budget123> 
    <Budget123:Budget123> 
     <Budget1:ID>6789</Budget1:ID> 
     <Budget1:Type>Project B</Budget1:Type> 
    </Budget123:Budget123> 
    <Budget123:Budget123> 
     <Budget1:ID></Budget1:ID> 
     <Budget1:Type>Project C</Budget1:Type> 
    </Budget123:Budget123> 
</Project:Forms> 

난 단지, 그렇지 않은 다른 모든 노드의 이름을 원하는

: Budget123, 또는 무엇이든 그것은 끝납니다.

select="$gelXmlData//Application/Forms/*[starts-with(local-name(),'Budget')]/ID/text()" var="ID" 

위의 코드는 노드 예산에 대한 값을 받고에서 일했다, 그러나 동시에, 나는 항상 예산으로 시작에 종속되지 않을 정도로는 동적 만들고 싶어.

답변

0

우선 입력 XML의 접두어 Budget123은 바인드되지 않고 </Project:Application>으로 올바르게 닫히지 않습니다.

는 확실하지 난 당신이 될 수있는 출력을하고 싶습니다 이해,하지만 난 그것을 시도주지 : 결과는

Budget123 Budget123 Budget123 

참고 될 것

//Application/Forms/*[starts-with(local-name(),'Budget')]/local-name() 

값 : 이 경로 노출의 동작은 사용하는 XPath의 버전에 따라 다릅니다. XPath 2.0을 사용하고 있다고 가정합니다. 그렇지 않으면, 당신은 그러나, 이것은 단지 발견 된 요소의 이름을 얻을 것입니다

local-name(//Application/Forms/*[starts-with(local-name(),'Budget')]) 

뭔가를해야합니다.

//*[local-name()='Application']/*[local-name()='Forms']/*[starts-with(local-name(),'Budget')]/local-name()" 
+0

제대로 결합 또는 폐쇄되지 않은 XML은 다음과 같습니다이 Forms의 모든 자식 요소를 포함하는 경우


, 당신은 단순히

//Application/Forms/*/local-name() 

네임 스페이스의 독립적 인 버전을 사용할 수 있습니다 데이터 스크러빙 문제. xml 파일에는 내가 원하지 않는 독점 정보가 들어 있습니다. 그것이 묶여 있고 적절히 닫힌다고 가정하십시오. 나는 네 가지 해결책을 모두 시도했고 다음과 같은 오류가 계속 발생합니다. – user4143204

+0

이 태그에 'select'라는 속성을 정의해야합니다. – user4143204

+0

또한 jelly를 사용하여 xml parse 및 xpath 문을 작성합니다. local-name()이 문제가되는 것처럼 보입니다. text()를 대체하면 불평이 없기 때문입니다. 죄송합니다. xpath와이 사이트에 조금 새로운 것 같습니다. 모든 도움에 감사드립니다. – user4143204