2012-01-10 4 views
1

XQUERY를 사용하여 filename을 다음 XML에서 검색 할 수 있습니까? 때로는 filename 속성이 속성 @filename 또는 @fileName에서 값을 검색 할 들어오는 XML..thinking에 fileName로 전송됩니다 ...XQUERY를 사용하여 속성 값 검색

<?xml version="1.0"?> 
<preFileDoc xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <senderId>ABC</senderId> 
    <receiverId>XYZ</receiverId> 
    <tranxCode>A001</tranxCode> 
    <inpXML version="1.0" encoding="UTF-8"> 
    <soap-env:Envelope> 
     <soap-env:Header msgcode="SPPCONVAKT" orig-system="002FTB" refid="65355ff50a172064484bf9da64c1e245" timestamp="2009-02-11 21:00:10.741" filename="SPPCONVAKT20090128001.dat"/> 
     <soap-env:Body> 
text1 
text2 
     </soap-env:Body> 
    </soap-env:Envelope> 
    </inpXML> 
</preFileDoc> 

추신 나는 /preFileDoc/inpXML/@filename을 사용하려고하지만 그것은 작동하지 않습니다. 그것은 단일 XQUERY에서 얻을 수 있습니까? 조언 주셔서 감사합니다 ...

+0

안녕 marc_s을 마지막으로

declare namespace soap-env="http://schemas.xmlsoap.org/soap/envelope/"; return /preFileDoc/inpXML//soap-env:Header/@filename 

filename의 다양한 총액은 모두 지정하여 해결할 수 있습니다 ..it 특정 xml 노드 값 쿼리에 대한 xquery를 지원하는 일부 개발 플랫폼에 있습니다. – user1140422

답변

0

SOAP XML 네임 스페이스를 존중하고 고려해야합니다! 난 당신이 사용중인 알 수 없기 때문에

, 나는 어떻게이 작업을 수행하는 방법을 말할 수 없다 -하지만이 루트 노드에 xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"을, 그리고 당신의 @filename 속성이 <soap-env:Header .... /> 노드에있는 - 그래서 당신은을 포함해야 XQuery의 XML 네임 스페이스.

.NET/C#에서, 당신은 (직접 XPath를 지원하는 "오래된"XmlDocument 스타일을 사용)과 같이 그것을 할 수 :

// define test XML 
string xmlContent = 
    @"<?xml version='1.0'?> 
    <preFileDoc xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'> 
     <senderId>ABC</senderId> 
     <receiverId>XYZ</receiverId> 
     <tranxCode>A001</tranxCode> 
     <inpXML version='1.0' encoding='UTF-8'> 
      <soap-env:Envelope> 
       <soap-env:Header msgcode='SPPCONVAKT' orig-system='002FTB' refid='65355ff50a172064484bf9da64c1e245' timestamp='2009-02-11 21:00:10.741' filename='SPPCONVAKT20090128001.dat'/> 
       <soap-env:Body> 
       text1 
       text2 
       </soap-env:Body> 
      </soap-env:Envelope> 
     </inpXML> 
    </preFileDoc>"; 

// create XmlDocument and load test data 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlContent); 

// define XML namespace manager and add the SOAP namespace to it 
XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); 
mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/"); 

// use XPath and the XML namespaces to grab the <Header> node 
// the first two nodes <preFileDoc> and <inpXML> are not inside any explicit 
// XML namespace 
// but the next two (<Envelope> and <Header>) are in the "soap" XML namespace 
XmlNode header = doc.SelectSingleNode("/preFileDoc/inpXML/soap:Envelope/soap:Header", mgr); 

// read the "filename" attribute from the header node 
if(header != null && header.Attributes["filename"] != null) 
{ 
    string fileName = header.Attributes["filename"].Value; 
} 
+0

안녕하세요 marc_s..your는 .NET/C#의 전체 솔루션을 제공하는 매우 친절합니다 ... ... 정말 감사드립니다.내가 아래의 XQUERY 아래의 문장에서 필요한 것을 얻고있다 : - /preFileDoc/inpXML/soap-env : Envelope/soap-env : 헤더/@ 파일명 |/preFileDoc/inpXML/soap-env : 봉투/비누 -env : Header/@ fileName – user1140422

1

는 여러 속성의 조합을 취할 수 있습니다. 이 속성이 다른 케이스와 여러 번 표시되지 않을 수도있을 것입니다, 그래서 항상 단일 노드 반환해야합니다 :

//soap-env:Header/@filename | //soap-env:Header/@fileName 

선택적으로, 괄호에 포장 수를 항상을 위해, 뒤에 [1] 추가 첫 번째 결과.

(//soap-env:Header/@filename | //soap-env:Header/@fileName)[1] 

당신이 순서 대신 문서 순서 노드 세트를 작성 쉼표와 노조를 교체 할 경우

, 당신은 말뿐만 아니라 기본을 추가 할 수 있습니다. 아마도 여기서는별로 도움이되지 않지만 다른 상황에서는 아마도

(//soap-env:Header/@filename , //soap-env:Header/@fileName, "default.dat")[1] 

HTH!

+0

감사합니다. grtjn ... 예. 절대적으로 제가 여러 속성의 조합에 필요한 해결책은 무엇입니까? :) – user1140422

1

XPath가 불완전하다고 생각합니다. 마지막 하위 단계 인 //preFileDoc/inpXML/@filename이고 그 하위 항목은 inpXML 요소의 속성과 일치합니다. 이 역시 soapenv:Bodyfilename라는 이름의 모든 속성을 찾을 것이라고

/preFileDoc/inpXML//@filename 

참고 : 문제를 해결하기

한 가지 방법은 // - 스텝 것이다.

보다 강력한 방법 따라서는 XQuery에서 soapenv 접두사 선언하는 것입니다 :

declare namespace soap-env="http://schemas.xmlsoap.org/soap/envelope/"; 

return /preFileDoc/inpXML//soap-env:Header/(@filename | @fileName) 
관련 문제