2013-01-02 135 views
-1

我有這樣的XML文件的屬性,我可以讀取所有將XML文件讀取

<?xml version="1.0" encoding="UTF-8"?> 
<cteProc xmlns="http://www.portalfiscal.inf.br/cte" versao="1.04"> 
    <CTe xmlns="http://www.portalfiscal.inf.br/cte"> 
     <infCte versao="1.04" ID="CTe3512110414557000014604"></infCte> 
    </CTe> 
</cteProc> 

我曾嘗試閱讀本使用C#

string chavecte;   
string CaminhoDoArquivo = @"C:\Separados\13512004-procCTe.xml"; 
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(CaminhoDoArquivo); //Carregando o arquivo 
chavecte = xmlDoc.SelectSingleNode("infCTe") 
        .Attributes.GetNamedItem("Id").ToString(); 

節點,但什麼是錯,此代碼。

+0

你熟悉XML命名空間的概念? –

+0

您的XML示例缺少Id屬性... –

+0

[在C#中使用帶默認命名空間的Xpath]的可能重複(http://stackoverflow.com/questions/585812/using-xpath-with-default-namespace-in-c-尖銳) - 最有可能的原因是在選擇「infCte」節點時缺少使用名稱空間的問題。 –

回答

2

更換

chavecte = xmlDoc.SelectSingleNode("infCTe").Attributes.GetNamedItem("Id").Value; 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable); 
nsmgr.AddNamespace("ab", "http://www.portalfiscal.inf.br/cte"); 

chavecte = xmlDoc.SelectSingleNode("//ab:infCte", nsmgr) 
       .Attributes.GetNamedItem("Id").Value; 

我也注意到,infCte沒有ID在你的XML

+1

由於XPath到「infCte」節點不包含「http://www.portalfiscal.inf.br/cte」命名空間,因此它不太可能提供幫助。 –

+0

@AlexeiLevenkov,對不起,當有人告訴你「它不起作用」時,有時很難找到所有原因。我會看看,然後進行編輯 –

4

屬性正確定義如果你想使用LINQ Xml

var xDoc = XDocument.Load(CaminhoDoArquivo); 
XNamespace ns = "http://www.portalfiscal.inf.br/cte"; 
var chavecte = xDoc.Descendants(ns+"infCte").First().Attribute("id").Value; 

PS:我假設你的XML的無效行是

<infCte versao="1.04" id="CTe3512110414557000014604"></infCte> 
+0

感謝代碼完美。我寫錯了,我忘了「id」 –

+0

+1。爲了獲得正確的答案,特別是對於魔術般的知道@alejandrocarnero不關心使用哪些XML解析類。 –

0

另一種可能的解決方案是:

string CaminhoDoArquivo = @"C:\Separados\13512004-procCTe.xml"; 
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(CaminhoDoArquivo); //Carregando o arquivo 

// Select the node you're interested in 
XmlNode node = xmlDoc.SelectSingleNode("/cteProc/CTe/infCte"); 
// Read the value of the attribute "ID" of that node 
string chavecte = node.Attributes["ID"].Value;