2015-10-13 98 views
0

我想知道如何獲取Xml文件的節點路徑。我粘貼在下面。所以我想創建一個方法,它將採用一個節點路徑並將節點路徑指向的元素的xml返回給我。從Xml獲取節點路徑

問題是假設我希望xml FormA1下的元素成員(其具有Mouser在成員/成員名稱/ BusinessNameLine1Txt下),我怎麼能得到它,因爲xml也有另一個成員元素(儘管與不同的BusinessNameLine1Txt = Mouser1)。

<ReturnState> 
<ReturnDataState>  
    <Form6> 
     <Header> 
     <BusinessActivityCode>423690</BusinessActivityCode> 
     <StateOfIncorporation> 
      <State>DE</State> 
      <YearOfIncorporation>2006</YearOfIncorporation> 
     </StateOfIncorporation> 
     </Header> 
     <Body> 
     <EstTaxPmtLessRefund>492823</EstTaxPmtLessRefund> 
     <Overpayment>118450</Overpayment> 
     <OverpaymentCreditedNxtYr>118450</OverpaymentCreditedNxtYr> 
     <Reconciliation></Reconciliation> 
     <SignatureArea></SignatureArea> 
     <Member>      
      <MemberName> 
      <BusinessNameLine1Txt>Mouser0</BusinessNameLine1Txt> 
      </MemberName>  
      <FormA1> 
      <PartI-SalesFactor> 
       <SalesDelOrShippedOutState>31754631</SalesDelOrShippedOutState>    
       <TotalSales> 
       <Wisconsin>31754631</Wisconsin> 
       <TotalCompany>1965873635</TotalCompany> 
       </TotalSales> 
       <SalesFactorTotal> 
       <Wisconsin>31754631</Wisconsin> 
       <TotalCompany>1965873635</TotalCompany> 
       </SalesFactorTotal> 
       <ApportionmentPercentage>0.000000</ApportionmentPercentage> 
      </PartI-SalesFactor> 
      </FormA1> 
     </Member> 
     <Member>      
      <MemberName> 
      <BusinessNameLine1Txt>Mouser1</BusinessNameLine1Txt> 
      </MemberName>  
      <FormA1> 
      <PartI-SalesFactor> 
       <SalesDelOrShippedOutState>31754632</SalesDelOrShippedOutState>    
       <TotalSales> 
       <Wisconsin>31754632</Wisconsin> 
       <TotalCompany>1965873633</TotalCompany> 
       </TotalSales> 
       <SalesFactorTotal> 
       <Wisconsin>31754632</Wisconsin> 
       <TotalCompany>196587344</TotalCompany> 
       </SalesFactorTotal> 
       <ApportionmentPercentage>1.000000</ApportionmentPercentage> 
      </PartI-SalesFactor> 
      </FormA1> 
     </Member> 
     </Body> 
    </Form6> 
    </ReturnDataState> 
</ReturnState> 

所以,如果我是通過該方法的路徑,

ReturnState/ReturnDataState/Form6 /美體/會員/ FormA1並希望它返回

<FormA1> 
    <PartI-SalesFactor> 
     <SalesDelOrShippedOutState>31754631</SalesDelOrShippedOutState> 
     <TotalSales> 
      <Wisconsin>31754631</Wisconsin> 
      <TotalCompany>1965873635</TotalCompany> 
     </TotalSales> 
     <SalesFactorTotal> 
      <Wisconsin>31754631</Wisconsin> 
      <TotalCompany>1965873635</TotalCompany> 
     </SalesFactorTotal> 
     <ApportionmentPercentage>0.000000</ApportionmentPercentage> 
    </PartI-SalesFactor> 
</FormA1> 

,而不是其他FormA1在不同的Member元素下。我會怎麼做?

非常感謝!

AJ。

+0

您如何區分您所需要的FormA1元素和您不需要的元素?你總是想要獲得第一個匹配元素嗎?還是有其他一些標準? – StriplingWarrior

+0

聽起來像[xpath](https://msdn.microsoft.com/en-us/library/ms256115%28v=vs.110%29.aspx) –

+0

嗨StriplingWarrior,感謝您的快速回復。這將是我面臨的挑戰之一,假設我想從第二個成員元素中檢索FormA1。我將如何能夠做到這一點? – user3375390

回答

1

您可以使用XPath查詢這樣的:

var xElement = XElement.Parse(str); //or however you load your xml document 
var formA1 = xElement.XPathSelectElement("ReturnDataState/Form6/Body/Member/FormA1"); 
Console.WriteLine(formA1.ToString()); 

因爲我以前XPathSelectElement代替XPathSelectElements,你將只能得到第一個匹配的元素。如果您想根據其他條件選擇結果,還可以使用其他技巧,例如position()選擇器。

+0

嗨StriplingWarrior,感謝您的快速回復。這將是我面臨的挑戰之一,假設我想從第二個成員元素中檢索FormA1。我將如何能夠做到這一點? – user3375390

+0

@ user3375390:如果你想要第二個,你可以用'/ FormA1 [position()= 2]'而不是'/ FormA1'來使用xpath。但是我在你對原始問題的評論中提出這個問題的原因是,我懷疑你需要根據某些標準得到一個特定的問題,但是你沒有提供足夠的信息讓我們知道你*知道你是哪一個元素想要選擇。 – StriplingWarrior

1

有幾種方法可以針對XML文檔運行XPath,其中一個是由StriplingWarrior在the other answer中提到的,所以我相信xpath是要走到這裏的路。您可以使用XPath謂詞([...])僅返回符合特定條件的元素。例如,你可以使用下面的XPath表達式來獲得具有盛大孩子BusinessNameLine1TxtMember元素用值等於"Mouser0"

Member[MemberName/BusinessNameLine1Txt='Mouser0'] 

說了這麼多,完整的XPath表達式得到這樣MemberFormA1元素會如下:

//Member[MemberName/BusinessNameLine1Txt='Mouser0']/FormA1 

xpathtester.com demo