웹 서비스에서 XML 파일을 받았는데이 XML이 네임 스페이스와 함께 제공되는 경우도 있지만 그렇지 않은 경우도 있습니다.
@myDoc 변수에 XML이 포함되어 있으면 select는 null을 반환합니다. 그러나 "xmlns"부분을 제거하면 select는 정상적으로 값을 반환합니다.
내가 무엇을 잘못하고 있지?
DECLARE @myDoc xml
DECLARE @CSTAT VARCHAR(MAX);
SET @myDoc = '<infProt Id="ID311140002329206" xmlns="some_namespace">
<cStat>100</cStat>
</infProt>'
SET @CSTAT = @myDoc.value('(/infProt/cStat)[1]', 'VARCHAR(MAX)' )
SELECT @CSTAT
를 사용하여 네임 스페이스를 지정하고 WITH XMLNAMESPACES
네임 스페이스에 별칭 을 지정해야 합니다 ( x
여기에서 사용 했습니다). 당신은 또한 전환해야합니다 SET
A가에 SELECT
이를 사용하는 :
WITH XMLNAMESPACES ('some_namespace' as x)
SELECT @CSTAT = @myDoc.value('(/x:infProt/x:cStat)[1]', 'VARCHAR(MAX)' );
Edit, Re : 네임 스페이스가 있거나없는 동적
네임 스페이스 불가지론 함수 local-name()
를 사용하여 네임 스페이스 를 우회 할 수 있습니다 .
SELECT @CSTAT = @myDoc.value(
'(/*[local-name()="infProt"]/*[local-name()="cStat"])[1]', 'VARCHAR(MAX)');
사용할 때 필수주의 사항은를 사용 local-name()
하지 않는 한 경로에서 동일한 이름을 가진 모든 네임 스페이스의 요소를 분명히 감지한다는 것 namespace-uri
입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다