2013-11-02 16 views
-2

我有嘗試讀取下面的XML C#程序,但無法讀取任何元素:爲什麼有一個xmlns導致我的C#程序不讀取XML?

<?xml version="1.0" encoding="UTF-8"?> 
    <!-- Comments Here --> 
    <FileFeed 
    xmlns="http://www.mycompany.com/schemas/xxx/FileFeed/V1" 
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.somecompany.com/schemas/xxx/FileFeed/V1 
    FileFeed.xsd" 
    RecordCount = "1"> 
<Object> 
    <ID>PAMSMOKE110113xxx</ID> 
    <CorpID>12509</CorpID> 
    <AnotherID>201654702345</AnotherID> 
    <TimeStamp>2013-09-03</TimeStamp> 
    <Type>Some Type</Type> 
    <SIM_ID>89011704258012600767</SIM_ID> 
    <Code>ZZZ</Code> 
    <Year>2013</Year> 
</Object> 
</FileFeed> 

通過上述XML我的C#程序是無法讀取的任何元素。對於實例ID元始終爲NULL。

現在,如果我只是從上面的XML中刪除第一個xmlns,我的程序可以讀取所有元素,沒有任何問題。問題是我必須以給定的格式處理XML文件,並且不能更改文件格式。我的程序讀取下面的XML就好了:注意行xmlns =「http://www.mycompany.com/schemas/xxx/FileFeed/V1」被刪除。

<?xml version="1.0" encoding="UTF-8"?> 
    <!-- Comments Here --> 
    <FileFeed 
     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.somecompany.com/schemas/xxx/FileFeed/V1   
     FileFeed.xsd" 
     RecordCount = "1"> 
     <Object> 
      <ID>PAMSMOKE110113xxx</ID> 
      <CorpID>12509</CorpID> 
      <AnotherID>201654702345</AnotherID> 
      <TimeStamp>2013-09-03</TimeStamp> 
      <Type>Some Type</Type> 
      <SomeNumber>89011704258012600767</SomeNumber> 
      <Code>ZZZ</Code> 
      <Year>2013</Year> 
     </Object> 
    </FileFeed> 

我意識到我沒有發表任何代碼,但只是想知道我能是具有什麼可能的問題,在這裏簡單地移除的xmlns線解決一切?

+0

這是實際的網址嗎?它似乎在中間有一個空格,如果它應該在這裏嘗試用'%20'代替它。 – SJuan76

+1

-1:有很多重複的內容 - 搜索「namespace XML」以找到它們。即http://stackoverflow.com/questions/2340411/use-linq-to-xml-with-xml-namespaces/2340497#2340497(如果使用LINQ-toXML)。 –

+0

你如何閱讀XML? –

回答

-1

Xml命名空間或多或少像C#命名空間。當它的名字空間被設置或者沒有設置時你能夠訪問一個類嗎?

public namespace My.Company.Schemas { 
    public class FileFeed 

VS

public class FileFeed { 

他們是兩個不同的類!這同樣適用於XML--通過設置一個名稱空間,可以使文檔具有相似或甚至相同的內部結構,但它們代表兩個不可交換的獨立文檔。這真的很方便。

如果您想獲得關於爲什麼實際閱讀方法不考慮名稱空間的幫助,則必須提供C#代碼。一般的規則是任何閱讀API都可以爲實際閱讀設置命名空間。

+0

謝謝大家,你是對的。只需將以下行添加到我的代碼中:XNamespace ns =「http://www.MyCompany.com/schemas/xxx/VehicleInstallFeed/V1」;然後必須執行以下操作才能正確讀取元素值:object.Element(ns +「ElementName」)。真的很感謝大家的反饋。 –

1

你的問題是與xml namespaces

使用Linq2Xml

XNamespace ns = "http://www.mycompany.com/schemas/xxx/FileFeed/V1"; 
var xDoc = XDocument.Load(fname); 
var id = xDoc.Root.Element(ns + "Object").Element(ns + "ID").Value; 
1

你的根元素FileFeed有一個命名空間屬性。這意味着其中的每個元素也使用該名稱空間。

Element方法以XName爲參數。通常你使用的字符串是implicitly converted into an XName

如果要包含名稱空間,請創建一個XNamespace並添加該字符串。由於XNamespace overloads the + operator這也將導致XName

XDocument doc = XDocument.Load("Test.xml"); 

// this will be null 
XElement objectElementWithoutNS = doc.Root.Element("Object"); 

XNamespace ns = doc.Root.GetDefaultNamespace(); 
XElement objectElementWithNS = doc.Root.Element(ns + "Object"); 
相關問題