2012-06-15 43 views
2

我遇到類似問題SelectNodes with XPath ignoring cases的問題,但在我的情況下,大寫/小寫問題出現在節點名爲'application'的節點中(有時是'Application'其他時間的'application' )。SelectNodes with XPath忽略節點名稱中的大小寫

我將如何應用其他職位的解決方案?或在這種情況下適用不同的?

XML:

<?xml version="1.0" encoding="utf-16" ?> 
<application> 
    <forms> 
    <action type="update"> 
     <form uid="" > 
     </form> 
    </action> 
    </forms> 
</application> 

在C#3.5:

XmlNode nodex= oXMLDoc1.SelectSingleNode("Application/forms/action/form/@uid") 
nodex.Value="UniqueIDx";//nodex is null :S 
+1

您是否必須使用XPath?我個人使用LINQ to XML和Where子句。應用程序/應用程序是否始終是根節點? (如果是這樣,你不能只是從那裏應用XPath?) –

+1

有趣的...你能用LINQ to XML發佈一個這種情況的例子嗎?和第一個節點作爲位置而不是名稱的XPATH之一?謝謝^^ – VSP

+0

@JonSkeet Ups我忘了直接回復你,請看上面的帖子 – VSP

回答

4

我們可能會將xml和我們的變量轉換爲小寫。

string value = "aBc"; 
XmlNode xmlnode = xmldoc.SelectSingleNode(string.Format("/some/path/add[translate(@key, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']", value.ToLower())); 
+0

感謝您的回答,因爲這是最通用的,所以它可以應用在其他情況下 – VSP

+0

「/ some/path/add」是什麼意思? – Varadha31590

2

所有我想提的是XML的首先是大小寫敏感的,所以應用意味着別的東西,然後應用程序,在我看來這應該在產生這個xml的代碼中被修復,但是如果你沒有控制權,那麼可以嘗試像這樣的xpath:

"Application/forms/action/form/@uid | application/forms/action/form/@uid" 

The |運算符將合併從xpath的 返回的節點集,在這種情況下它將是一個或另一個

+0

是的,知道xml是區分大小寫的,但有效的xml生成依賴於第三方,所以這是需要的...你的方法工作正常,但我想知道是否可能與LINQ to XML或通過possition獲取第一個節點會更加優化,因爲在此解決方案中,代碼嘗試獲取兩個節點... – VSP

1

如果根元素是字母大小寫可以更改的唯一元素,那麼您應該簡單地執行例如

XmlDocument doc = new XmlDocument(); 
doc.Load("input.xml"); 
XmlNode nodex= oXMLDoc1.DocumentElement.SelectSingleNode("forms/action/form/@uid"); 

如已在評論中所建議的那樣。

有了XDocument,你可以做

XDocument doc = XDocument.Load("input.xml"); 
doc.Root.Element("forms").Element("action").Element("form").SetAttributeValue("uid", "UniqueIDx"); 

[編輯]發表評論稱的第一個例子路徑拋出一個異常,這裏是一個貼不拋出異常,我和使用相同路徑的完整樣本之前:

  string xml = @"<application> 
    <forms> 
    <action type=""update""> 
     <form uid="""" > 
     </form> 
    </action> 
    </forms> 
</application>"; 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xml); 
      XmlNode nodex = doc.DocumentElement.SelectSingleNode("forms/action/form/@uid"); 
      nodex.Value = "UniqueIDx"; 

      doc.Save(Console.Out); 
+0

嘗試使用nullreferenceexception嘗試您的第一個示例失敗,形式/行動/形式/ @ uid – VSP

+0

隨着您發佈的示例,我認爲我的建議應該工作,我將編輯我的帖子,以顯示一個完整的示例,不會爲我拋出異常。 –

3

只需使用

*[translate(name(), 'APPLICATION', 'application')='application'] 
    /forms/action/form/@uid 

這在所有情況下正確地選擇想要的屬性,當電流(初始上下文)節點公頃這是一個有名字的孩子,那就是任何字符串「應用」的大小寫。

XSLT - 基於驗證

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
     "*[translate(name(), 'APPLICATION', 'application')='application'] 
      /forms/action/form/@uid"/> 
</xsl:template> 
</xsl:stylesheet> 

當施加於下面的XML文檔這種轉變:

<aPPliCatioN> 
<forms> 
    <action> 
    <form uid="xyz"/> 
    </action> 
</forms> 
</aPPliCatioN> 

有用節點被選擇,並且它的字符串值複製到輸出:

xyz 

說明

正確使用的標準XPath函數name()translate()