2013-04-02 96 views
3

我正在解析一個xml文件。從xml文檔中使用linq刪除xmlns =「something」到xml

xml的第一行看起來像;

<DataSetMenu xmlns="http://tempuri.org/DataSetMenu.xsd"> 

我使用下面的代碼來解析xml。

string filename = Request.QueryString["file"].ToString(); 
XElement xdocument = XElement.Load(Server.MapPath("xml\\" + filename)); 

xdocument.Attribute("xmlns").Remove(); 

IEnumerable<XElement> MenuGroups = xdocument.Elements(); 

sb.Append("<link href='StyleSheet.css' rel='stylesheet' type='text/css' />"); 
foreach (var xel in MenuGroups) 
{ 

    if (xel.Elements("MenuCatName").Any()) 
    { 
     Int32 MenuCatID = Convert.ToInt32(xel.Element("MenuCatID").Value); 
     string MenuCatName = xel.Element("MenuCatName").Value; 
     sb.Append("<div class='CategoryDiv'><h1 class='category'>" + MenuCatName + " </h1>"); 
     GetGroupItems(xdocument, MenuCatID); 
    } 
} 

但是,當過XML文件的第一個節點包含:

xmlns="http://tempuri.org/DataSetMenu.xsd" 

它不會在所有的工作。當我嘗試訪問XML的數據它給我的錯誤,對象引用不設置到對象

XML文件

<DataSetMenu xmlns="http://tempuri.org/DataSetMenu.xsd"> 
    <MenuCategories> 
    <MenuCatID>10108</MenuCatID> 
    <MenuCatName>SPEICALS</MenuCatName> 
    <BusinessEntityID>20137</BusinessEntityID> 
    <DisplayIndex>10107</DisplayIndex> 
    <MenuCatDesc /> 
     <Visible>true</Visible> 
     <ImagePath /> 
    </MenuCategories> 
    <MenuCategories> 
    <MenuCatID>10109</MenuCatID> 
    <MenuCatName>GENERAL MENU</MenuCatName> 
    <BusinessEntityID>20137</BusinessEntityID> 
    <DisplayIndex>10108</DisplayIndex> 
     < MenuCatDesc /> 
     <Visible>true</Visible> 
     <ImagePath /> 
    </MenuCategories> 
    <MenuGroups> 
    <MenuGroupID>110079</MenuGroupID> 
    <MenuCatID>10108</MenuCatID> 
    <MenuGroupName>SPECIAL OFFERS</MenuGroupName> 
    <MenuGroupDesc /> 
    <Visible>true</Visible> 
    <DisplayIndex>0</DisplayIndex> 
    <MenuTypeID>1</MenuTypeID> 
    <ImagePath /> 
    <ServiceTimeEnforced>false</ServiceTimeEnforced> 
    <ServiceStartTime>1900-01-01T11:00:00-06:00</ServiceStartTime> 
    <ServiceEndTime>1900-01-01T15:00:00-06:00</ServiceEndTime> 
    <Monday>true</Monday> 
    <Tuesday>true</Tuesday> 
    <Wednesday>true</Wednesday> 
    <Thursday>true</Thursday> 
    <Friday>true</Friday> 
    <Saturday>true</Saturday> 
    <Sunday>true</Sunday> 
    </MenuGroups> 
    </DataSetMenu> 

給我一個解決方案,使其正常工作的一個實例。或以任何方式刪除此屬性。

謝謝。

現在,它現在在這裏工作

private void GetGroupItems(XElement xdocument, Int32 MenuCatID) 
{ 

    var MenuGroup = from nm in xdocument.Elements("MenuGroups") 
        where (int)nm.Element("MenuCatID") == MenuCatID 
        select nm; 

    foreach (XElement GroupName in MenuGroup) 
    { 
     Int32 MenuGroupID = Convert.ToInt32(GroupName.Element("MenuGroupID").Value); 
     string MenuGroupName = GroupName.Element("MenuGroupName").Value; 
     sb.Append("<div class='IType'>" + MenuGroupName + " </div>"); 
     sb.Append("<table class='restaurantlist'><tbody><tr><td class='righttd'>"); 
     GetMenuItems(MenuGroupID, xdocument); 
     sb.Append("</td></tr></tbody></table>"); 
     sb.Append("<div class='restaurantlistdiv'><div style='clear: both;'></div>"); 
    } 
} 

請告訴我,我應該如何修改呢?

+0

顯示整個XML文件。 – MarcinJuraszek

+0

它真的是一個大文件。向您展示第一個節點。 –

+0

我已經用xml代碼更新我的問題。 –

回答

2

當您查詢XML時,必須指定命名空間。

創建XNamespace例如:

var ns = XNamespace.Get("http://tempuri.org/DataSetMenu.xsd"); 

然後使用XNamespace + String operator implementation

public static XName operator +(
    XNamespace ns, 
    string localName 
) 

Elements()方法調用,這樣的:

IEnumerable<XElement> MenuGroups = xdocument.Elements(); 

sb.Append("<link href='StyleSheet.css' rel='stylesheet' type='text/css' />"); 
foreach (var xel in MenuGroups) 
{ 

    if (xel.Elements(ns + "MenuCatName").Any()) 
    { 
     Int32 MenuCatID = Convert.ToInt32(xel.Element(ns + "MenuCatID").Value); 
     string MenuCatName = xel.Element(ns + "MenuCatName").Value; 
     sb.Append("<div class='CategoryDiv'><h1 class='category'>" + MenuCatName + " </h1>"); 
     GetGroupItems(xdocument, MenuCatID); 
    } 
} 
+0

哦,非常感謝。它的工作。但是,我遇到了問題。那也是因爲命名空間。請告訴我如何解決它。我正在更新我的問題。謝謝。 –

+0

我hvae更新了我的問題。請檢查最後添加的一個代碼。我需要你多一點幫助來解決它。謝謝。 –

+1

只需在每個元素()和元素()調用中添加'ns +'... – MarcinJuraszek