使用 linq to xml 从 xml 文档中删除 xmlns="something"
Posted
技术标签:
【中文标题】使用 linq to xml 从 xml 文档中删除 xmlns="something"【英文标题】:remove xmlns="something" from xml document using linq to xml 【发布时间】:2013-03-23 22:54:04 【问题描述】:我正在解析一个 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>");
请告诉我,我应该如何修改?
【问题讨论】:
它确实是一个大文件。向您展示前几个节点。 我已经用 xml 代码更新了我的问题。 我认为去找 XML 文件的发起者并告诉他们给你一个具有有效命名空间的 XML 文件......如果可能的话。 【参考方案1】:查询 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);
【讨论】:
哦,非常感谢。它的工作。但是在某个地方我遇到了问题。那也是因为命名空间。请告诉我如何解决它。我正在更新我的问题。谢谢。 我更新了我的问题。请检查添加的最后一个代码。我需要你多一点帮助来解决它。谢谢。 现在我在“XNamespace.Get()”中给出了静态命名空间。但如果我想让它动态化。因为不同的xml文件可能包含不同的命名空间。我能做到吗?【参考方案2】:这里要记住的关键是您使用的不是属性,而是命名空间声明。这就是为什么您不能只删除该属性。看看C#: How to remove namespace information from XML elements的建议是否有帮助。
【讨论】:
以上是关于使用 linq to xml 从 xml 文档中删除 xmlns="something"的主要内容,如果未能解决你的问题,请参考以下文章
使用LINQ TO XML 创建xml文档,以及读取xml文档把内容显示到GridView例子