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"
위의 코드는 노드 예산에 대한 값을 받고에서 일했다, 그러나 동시에, 나는 항상 예산으로 시작에 종속되지 않을 정도로는 동적 만들고 싶어.
제대로 결합 또는 폐쇄되지 않은 XML은 다음과 같습니다이
Forms
의 모든 자식 요소를 포함하는 경우, 당신은 단순히
네임 스페이스의 독립적 인 버전을 사용할 수 있습니다 데이터 스크러빙 문제. xml 파일에는 내가 원하지 않는 독점 정보가 들어 있습니다. 그것이 묶여 있고 적절히 닫힌다고 가정하십시오. 나는 네 가지 해결책을 모두 시도했고 다음과 같은 오류가 계속 발생합니다. – user4143204
이 태그에 'select'라는 속성을 정의해야합니다. – user4143204
또한 jelly를 사용하여 xml parse 및 xpath 문을 작성합니다. local-name()이 문제가되는 것처럼 보입니다. text()를 대체하면 불평이 없기 때문입니다. 죄송합니다. xpath와이 사이트에 조금 새로운 것 같습니다. 모든 도움에 감사드립니다. – user4143204