반응형
XPath로 XML 노드를 선택할 때 네임 스페이스를 무시하는 방법
다음과 같은 XML 문서를 구문 분석해야합니다.
<?xml version="1.0" encoding="UTF-8" ?>
<m:OASISReport xmlns:m="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd">
<m:MessagePayload>
<m:RTO>
<m:name>CAISO</m:name>
<m:REPORT_ITEM>
<m:REPORT_HEADER>
<m:SYSTEM>OASIS</m:SYSTEM>
<m:TZ>PPT</m:TZ>
<m:REPORT>AS_RESULTS</m:REPORT>
<m:MKT_TYPE>HASP</m:MKT_TYPE>
<m:UOM>MW</m:UOM>
<m:INTERVAL>ENDING</m:INTERVAL>
<m:SEC_PER_INTERVAL>3600</m:SEC_PER_INTERVAL>
</m:REPORT_HEADER>
<m:REPORT_DATA>
<m:DATA_ITEM>NS_PROC_MW</m:DATA_ITEM>
<m:RESOURCE_NAME>AS_SP26_EXP</m:RESOURCE_NAME>
<m:OPR_DATE>2010-11-17</m:OPR_DATE>
<m:INTERVAL_NUM>1</m:INTERVAL_NUM>
<m:VALUE>0</m:VALUE>
</m:REPORT_DATA>
문제는 네임 스페이스 "http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"가 때때로 다를 수 있다는 것입니다. 완전히 무시하고 MessagePayload 다운 스트림 태그에서 내 데이터를 가져오고 싶습니다.
지금까지 사용중인 코드는 다음과 같습니다.
String[] namespaces = new String[1];
String[] namespaceAliases = new String[1];
namespaceAliases[0] = "ns0";
namespaces[0] = "http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd";
File inputFile = new File(inputFileName);
Map namespaceURIs = new HashMap();
// This query will return all of the ASR records.
String xPathExpression = "/ns0:OASISReport
/ns0:MessagePayload
/ns0:RTO
/ns0:REPORT_ITEM
/ns0:REPORT_DATA";
xPathExpression += "|/ns0:OASISReport
/ns0:MessagePayload
/ns0:RTO
/ns0:REPORT_ITEM
/ns0:REPORT_HEADER";
// Load up the raw XML file. The parameters ignore whitespace and other
// nonsense,
// reduces DOM tree size.
SAXReader reader = new SAXReader();
reader.setStripWhitespaceText(true);
reader.setMergeAdjacentText(true);
Document inputDocument = reader.read(inputFile);
// Relate the aliases with the namespaces
if (namespaceAliases != null && namespaces != null)
{
for (int i = 0; i < namespaceAliases.length; i++)
{
namespaceURIs.put(namespaceAliases[i], namespaces[i]);
}
}
// Cache the expression using the supplied namespaces.
XPath xPath = DocumentHelper.createXPath(xPathExpression);
xPath.setNamespaceURIs(namespaceURIs);
List asResultsNodes = xPath.selectNodes(inputDocument.getRootElement());
네임 스페이스가 변경되지 않으면 잘 작동하지만 분명히 그렇지 않습니다. 네임 스페이스를 무시하도록하려면 어떻게해야합니까? 또는 가능한 모든 네임 스페이스 값 집합을 알고있는 경우 어떻게 모두 XPath 인스턴스에 전달할 수 있습니까?
사용 :
/*/*/*/*/*
[local-name()='REPORT_DATA'
or
local-name()='REPORT_HEADER'
]
더 완전한 구문을 원하는 사람이 있습니까?
String xPathExpression = "/*[local-name()='OASISReport]
/*[local-name()='MessagePayload]
/*[local-name()='RTO]
/*[local-name()='REPORT_ITEM]
/*[local-name()='REPORT_DATA"];
Btw, XPath에 요소 인덱스 위치도 필요한 경우 :
String xPathExpression = "/*[local-name()='OASISReport][1]
이것은 FAQ입니다 (하지만 오늘은 중복 검색이 게으르다)
XPath 1.0에서
//*[local-name()='name']
Selects any element with "name" as local-name.
In XPath 2.0 you can use:
//*:name
ReferenceURL : https://stackoverflow.com/questions/4402310/how-to-ignore-namespace-when-selecting-xml-nodes-with-xpath
반응형
'Program Club' 카테고리의 다른 글
| TSQL 날짜 시간 ISO 8601 (0) | 2021.01.06 |
|---|---|
| 스택과 힙이 충돌 할 때 일어나는 일 (0) | 2021.01.06 |
| 자바 스레드가 완료 될 때까지 기다립니다. (0) | 2021.01.05 |
| XML 레이아웃에서 "탭 순서"를 설정할 수 있습니까? (0) | 2021.01.05 |
| 배열이있는 배열을 문자열로 정렬 (0) | 2021.01.05 |