문제

이야기는 무엇 뒤에 XPath 및 지원을 위한 네임스페이스?았다 XPath 사양으로 앞에 있는 네임스페이스?가 있는 경우 문서는 요소를 제공하고있는 기본 네임스페이스:

<foo xmlns="uri" />

그것은 나의 일부이지만 XPath 프로세서 라이브러리를 인정하지 않을 것 //foo 때문에의 네임스페이스 하는 반면 다른 것입니다.이 옵션을 내 팀은 생각에 대한 추가하는 네임스페이스를 사용하여 접두사를 정기적인 표현을 XPath(추가할 수 있는 네임스페이스 접두사를 통해 XmlNameTable)하지만 이것은 부서지기 쉬운 이후 XPath 한 가동 가능한 언어에 관해서 노드를 테스트합니다.

은 거기에 적용되는 표준 이?

나 접근법은 비트 hackish 그러나 작동이 잘 보;를 제거 xmlns 선언으로 검색/교체 및 그 적용 XPath.

string readyForXpath = Regex.Replace(xmldocument, "xmlns=\".+\"", String.Empty );

는 공정한 접근 또는 누군가는 해결이 다른가?

도움이 되었습니까?

해결책

저도 비슷한 것 palehorse 제안하고 그것을 얻을 수 있다.었기 때문에 데이터를 얻기에서 게시된 서비스를 변경할 수 없습니다 xml.내가 사용하여 종료하고 XmlDocument XmlNamespaceManager 그래서 다음과 같:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlWithBogusNamespace);            
XmlNamespaceManager nSpace = new XmlNamespaceManager(doc.NameTable);
nSpace.AddNamespace("myNs", "http://theirUri");

XmlNodeList nodes = doc.SelectNodes("//myNs:NodesIWant",nSpace);
//etc

다른 팁

당신은 필요한 지역 이름():

http://www.w3.org/TR/xpath#function-local-name

을 침대에서 http://jcooney.net/archive/2005/08/09/6517.aspx:

<foo xmlns='urn:foo'>
  <bar>
    <asdf/>
  </bar>            
</foo>

이 표현과 일치하"바"요소:

  //*[local-name()='bar'] 

이 하나 되지 않습니다:

 //bar

문제는 요소 없이는 네임스페이스로 선언되었에 NULL 네임스페이스-따라서 경우//foo 일치하는 네임스페이스에 대해 당신이 생각하는'기본'수 없을 참조하는 요소에서 null 네임스페이스가 있습니다.

잘 기억하는 접두사를 위한 네임스페이스만을 줄임 컨벤션,실제 소자의 이름(자격을 갖춘 이름 또는 QName 에 대한 짧은)로 구성되어 있의 네임스페이스는 로컬 이름입니다.변화하는 접두사를 위한 네임스페이스 변경되지 않는'id'의 요소인 경우에는 동일한 네임스페이스와 동일한 지역 이름은 그 다음 그것은 동일한 종류의 요소는 경우에도,접두사가 다릅니다.

XPath2.0(또는 오히려 XSLT2.0)의 개념의'기본 xpath 네임스페이스'.당신은 설정할 수 있습니다 xpath--기본적으로 네임스페이스 특성에 xsl:스타일 요소입니다.

하려고 하는 경우 사용 xslt 추가할 수 있는 네임스페이스에서의 스타일 시트를 선언입니다.만약 당신이 그렇게 한다면,는지 확인해야 합니다 거기에는 접두어 또는 그것은 작동하지 않습니다.는 경우 원본 XML 하지 않는 접두어,그는 여전히 미세한 추가 자신의 접두사에서됩니다.

스타일 시트

<xsl:stylesheet
    xmlns:fb="uri"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="fb:foo/bar">
        <!--  do stuff here -->
    </xsl:template>
</xsl:stylsheet>

입니다.

를 사용하여 이 프로그램은 그것이 작동:

http://xmlsoft.org/examples/xpath1.c

 int 
register_namespaces(xmlXPathContextPtr xpathCtx, const xmlChar* nsList) {
    xmlChar* nsListDup;
    xmlChar* prefix;
    xmlChar* href;
    xmlChar* next;

    assert(xpathCtx);
    assert(nsList);

    nsListDup = xmlStrdup(nsList);
    if(nsListDup == NULL) {
    fprintf(stderr, "Error: unable to strdup namespaces list\n");
    return(-1); 
    }

    next = nsListDup; 
    while(next != NULL) {
    /* skip spaces */
    while((*next) == ' ') next++;
    if((*next) == '\0') break;

    /* find prefix */
    prefix = next;
    next = (xmlChar*)xmlStrchr(next, '=');
    if(next == NULL) {
        fprintf(stderr,"Error: invalid namespaces list format\n");
        xmlFree(nsListDup);
        return(-1); 
    }
    *(next++) = '\0';   

    /* find href */
    href = next;
    next = (xmlChar*)xmlStrchr(next, ' ');
    if(next != NULL) {
        *(next++) = '\0';   
    }

    /* do register namespace */
    if(xmlXPathRegisterNs(xpathCtx, prefix, href) != 0) {
        fprintf(stderr,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", prefix, href);
        xmlFree(nsListDup);
        return(-1); 
    }
    }

    xmlFree(nsListDup);
    return(0);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top