programing

XElement 또는 LINQ와 함께 XPath를 사용하는 방법은 무엇입니까?

minimums 2023. 9. 10. 12:06
반응형

XElement 또는 LINQ와 함께 XPath를 사용하는 방법은 무엇입니까?

다음과 같은 XML을 생각해 보십시오.

<response>
  <status_code>200</status_code>
  <status_txt>OK</status_txt>
  <data>
    <url>http://bit.ly/b47LVi</url>
    <hash>b47LVi</hash>
    <global_hash>9EJa3m</global_hash>
    <long_url>http://www.tumblr.com/docs/en/api#api_write</long_url>
    <new_hash>0</new_hash>
  </data>
</response>

를 을 을 는 를 <hash> 노력했습니다.

var hash = xml.Element("hash").Value;

하지만 그건 안 돼요.XPath를에수까할?에할 수 ?XElement할 수 요? 형이랑 할 수 있어요.System.Xml프레임워크, 다음과 같은 작업을 수행합니다.

xml.Node("/response/data/hash").Value

LINQ 네임스페이스에 이런 것이 있습니까?


업데이트:

이것을 좀 더 가지고 돌아다닌 후에 저는 제가 하려는 일을 할 수 있는 방법을 찾았습니다.

var hash = xml.Descendants("hash").FirstOrDefault().Value;

더 나은 해결책이 있는 사람이 있는지 알고 싶습니다.

하려면 XML에 대한 합니다(LINQ 를 XPath 하려면 합니다 을 에 합니다 을 ).System.Xml.XPath, 의 확장 방법이 적용됩니다.

예에서:

var value = (string)xml.XPathEvaluate("/response/data/hash");

다른 사람들은 "네이티브" LINQ to XML 쿼리를 사용하여 원하는 작업을 수행하는 방법을 전적으로 합리적으로 제안했습니다.

그러나, 많은 대안을 제공하기 위하여, 고려하고, XPath 식을 평가하기 위하여,XNode입니다.)XNode를 사용하여 를 작성할 수도 있습니다.XPathNavigator당분간은XNode.

개인적으로 저는 직접 LINQ to XML API를 사용하는 것을 매우 좋아합니다. 왜냐하면 저는 LINQ의 열렬한 팬이기 때문입니다. 하지만 XPath가 더 편하다면 위의 내용이 도움이 될 것입니다.

LINQ to XML을 처리할 때 실제 개체를 얻기 위해 LINQ를 사용하는 것이 어떻습니까?

자손은 전체 XML에서 각 요소를 찾고 지정한 이름과 일치하는 모든 개체를 나열합니다.그래서 당신의 경우 해시는 그것이 찾는 이름입니다.

그래서 하기 보다는

var hash = xml.Descendants("hash").FirstOrDefault().Value;

나는 다음과 같이 헤어질 것입니다.

var elements = xml.Descendants("hash");
var hash = elements.FirstOrDefault();

if(hash != null)
 hash.Value // as hash can be null when default. 

이렇게 하면 속성, 노드 요소 등도 얻을 수 있습니다.

도움이 되도록 이 기사를 확인하여 명확한 아이디어를 얻으십시오.http://www.codeproject.com/KB/linq/LINQtoXML.aspx 이것이 당신에게 도움이 되기를 바랍니다.

사용하시면 됩니다.XPath-유사 구조를 형성하도록 요소들을 사슬로 묶는 요소() 방법

예를 들어 다음과 같습니다.

XElement xml = XElement.Parse(@"...your xml...");
XElement hash = xml.Element("data").Element("hash");

저는 xpath 생성을 위한 LINQesq 프레임워크를 마련하려고 노력했습니다.c# 람다 식을 사용하여 xpath를 설명할 수 있습니다.

var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && e.Parent.Name == "tr");

var xpath = CreateXpath.Where(e => e.TargetElementName == "td").Select(e => e.Text);

이런 맥락에서 도움이 될지는 모르겠지만, 여기에서 설명서를 찾을 수 있습니다.

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq

대답은 Yes & No 입니다.그것은 가능하지만 함께는 안됩니다.XElement~하듯이Xelement문서 전체를 나타내는 것이 아니라 단지 일부를 나타내는 것입니다.XDocumentxml 문서 전체를 나타내는 것은 다음과 같은 함수를 갖습니다.XPathSelectElement()바로 이 점을 위하여

그래서 Xml 같은 경우에는

<response>
  <status_code>200</status_code>
  <status_txt>OK</status_txt>
  <data>
    <url>http://someurl/b47LVi</url>
    <hash>b47LVi</hash>
    <global_hash>9EJa3m</global_hash>
    <long_url>http://www.tumblr.com/docs/en/api#api_write</long_url>
    <new_hash>0</new_hash>
  </data>
</response>

먼저 다음과 같이 읽으셔야 합니다.XDocument와 함께

XDocument.Parse("xmlcontent..");

//convert from Xelement
var xe = XElement.Parse("xml string data...");
var xd = new XDocument(xe);

그럼 전화해 보세요.XDocument.XPathSelectElement("/response/data/hash")아래 예제와 같은 결과를 얻으려면 다음을 수행합니다.

void Main()
{
    var xm = @"<response>
  <status_code>200</status_code>
  <status_txt>OK</status_txt>
  <data>
    <url>http://someurl/b47LVi</url>
    <hash>b47LVi</hash>
    <global_hash>9EJa3m</global_hash>
    <long_url>http://www.tumblr.com/docs/en/api#api_write</long_url>
    <new_hash>0</new_hash>
  </data>
</response>";
    
    var xd = XDocument.Parse(xm);
    xd.XPathSelectElement("/response/data/hash").Dump("element");
    xd.XPathSelectElement("/response/data/hash").Value.Dump("value");

}

참고:Dump()하는 방법입니다.Console.WriteLine()마지막으로 교체해주시기 바랍니다.

결과는 다음과 같습니다.

언급URL : https://stackoverflow.com/questions/3642829/how-to-use-xpath-with-xelement-or-linq

반응형