2014-12-27 2 views
2

의 System.Xml.XPath.XPathException를주고 내가 다음 코드XPathNavigator를 때문에 작은 따옴표

XPathNavigator nav = doc.CreateNavigator(); 
XPathExpression expr; 
expr = nav.Compile("//somePath/FieldData[@Location='Payer's Name']/@Value"); 

작은 따옴표는 예외 System.Xml.XPath.XPathException를 제공을합니다. 나는 슬래시 ('\'), ('), 이중 작은 따옴표로 이스케이프 처리를 시도했다. 아무것도 작동하지 않는 것 같습니다. 어떤 생각이 어떻게 해결할 수 있습니까?

+0

사용'정상화-space' – Avijit

+0

을 나는 그것이 공간 – nnm

+0

'문자열 SUSER = "U'1"함께 할 수 없다 확신; XmlNode xnUser = xmlDocument.SelectSingleNode ("tm : TM/tm : 사용자/ID : \" "+ sUser +"\ "]", TMNamespaceManager), ' – Avijit

답변

0

당신이 XPath는에 공간이 없습니다 "[위치 @ = '선수의 이름'] 따옴표로 대체되었습니다 밖으로 공간

+0

공간이 문제가되지 않습니다. 공간과 함께 사용했습니다. – nnm

+0

공간 문자열 상수는 구문 요소가 아니며 아무런 차이가 없습니다. 이 문제는 어포 스트로피로 구분 된 문자열 안에 아포스트로피가있어 파스가 문자열 상수가 의도 한 것보다 먼저 끝나고 유효한 XPath로 다음 문자열 조각을 구문 분석 할 수 없다고 생각하게합니다. 물론 그렇지 않습니다. – Flynn1179

0

참고 작은 따옴표 (트러블 메이커) 걸릴.

string sUser = "Payer's name"; // as per OP requirement considering only single quote expr = nav.Compile("//somePath/FieldData[@Location=\"" + sUser + "\"]/@Value")

+0

그래서 변수에 큰 따옴표가 포함되어 있다면 어떻게 될까요? 당신이 보장 할 수 있다면이 일은 일어나지 않을 것입니다,하지만 이것이 확실히이 코드 조각의 전제 조건임을 분명히했습니다. – Flynn1179

1

안정적으로이 상황을 처리하기 위해 기본적으로 두 가지 방법이 있습니다.

첫 번째 방법은 당신이하는 XPath 변수에 사용할 값을 VariableContext을 정의하고 배치하는 것입니다. 그럼 당신은 expre을 사용할 수 있습니다 같은 시온 :

//somePath/FieldData[@Location = $user]/@Value 

나는 그 방법을 설명합니다 in this post. VariableContext 클래스를 만드는 것이 필요합니다. .NET에 적합한 것은 없지만 대부분의 경우 그대로 제공해야합니다.

다른 옵션은 Linq-to-XML을 사용하는 것입니다. 당신이 경로를 이동하는 경우, 당신은 Linq에 대신 XPath를 사용하여 노드를 조회 할 수 있으며, 구분 기호는이 방법으로 문제가되지 않습니다 :

// here the doc variable is an XElement or XDocument 
var value = (from fd in doc.Descendants("FieldData") 
      where (string)fd.Attribute("Location") == sUser 
      select fd.Attribute("Value")).FirstOrDefault(); 

또는 기타의 LINQ 구문

:

var value = doc.Descendants("FieldData") 
       .Where(fd => (string)fd.Attribute("Location") == sUser) 
       .Select(fd => fd.Attribute("Value")) 
       .FirstOrDefault(); 
0

어떤 이유가 C# 언어를 사용하는 경우 왜 LINQ를 사용할 수 없습니까?

using System.Xml.Linq; 

public class XmlParser 
{ 
    public XDocument doc { get; set;} 

    public XmlParser (XDocument doc) 
    { 
     this.doc = doc; 
    } 

    public List<XElement> searchElements (String elementName) 
    { 
     return doc.Elements(elementName).ToList<XElement>(); //this will search for all child nodes and return the elements with the specified name. 
    } 
} 
0
expr = nav.Compile("//somePath/FieldData[@Location=\"Payer's Name\"]/@Value");