【问题标题】:Is there any way to make an - XML element value - dynamic?有什么方法可以使 - XML 元素值 - 动态的?
【发布时间】:2011-06-03 00:22:39
【问题描述】:

我知道这个问题似乎不合逻辑,但我必须尝试,我希望找到方法,

我有一个 DLL 程序集从 XML 文件中读取变量“GalleryID”。我无法修改程序集,所以我想知道是否可以使 XML 元素值动态化?例如,在不更改程序集的情况下从查询字符串或任何其他场景中获取此值。

Settings.xml:

< ?xml version="1.0" encoding="utf-8"? >

< GallerySettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
    < GalleryID >2< /GalleryID >   // Here I would like this value to be dynamic, not static like this.
< /GallerySettings >

mylibrary 程序集中:

protected static XmlDocument myXmlDoc;
    ' in Page_Load ev mylibrary

    MyLibrary.myXmlDoc.Load(base.Server.MapPath("Conntrols/Settings.xml"));
    XmlNode documentElement = MyLibrary.myXmlDoc.DocumentElement;
    MyLibrary.myappSettings.GalleryID = documentElement.SelectSingleNode("GalleryID").ChildNodes[0].Value.ToString();

这是一个拥有多个用户的 ASP.NET 网站。当用户登录并打开gallery.aspx 页面时,它将显示用户自己的画廊。这种情况现在不起作用,因为图库模块根据Settings.xml 文件中的设置向所有用户显示一个图库 (Galleryid=2)。如何在查询字符串中传递galleryid -- gallery.aspx?galleryid=5 并将其注入Settings.xml 文件?

这可能吗?

【问题讨论】:

  • MyLibrary.myappSettings 有没有可能是单身人士?如果是这样,那么 GalleryID 的值对于所有用户将始终相同。
  • @hans-kesting:不,不是,谢谢

标签: c# .net asp.net xml vb.net


【解决方案1】:

我将重申我从你的问题中理解的内容,以确保我“明白”。

您有一个程序集(来自 .dll),它读取 XML 文件作为数据源,以从如下节点获取“GalleryID”:&lt;GalleryID&gt;2&lt;/GalleryID&gt;

您希望能够在程序集读取它之前更改 GalleryID

假设(是的,很危险...)您正在从您可以控制的应用程序中调用程序集。 (因为,您可能无法控制读取 XML 文档的程序集。)这将是调用上下文,以及定义 Server.MapPath 中“服务器”将在何处查找 "Conntrols/Settings.xml" 的确切主机

我想到了两个基本的解决方案:

  1. 打开 XML 文档,更改值并将其从调用上下文中保存。
  2. 从调用上下文中将 XML 文档“settings.xml.alt”替换为“settings.xml”。

【讨论】:

  • 非常感谢您的回复,我的问题和您上面描述的完全一样,但是这是一个有多个用户的 ASP.net 网站,当用户登录并打开 gallery.aspx 页面时会显示他自己的画廊这个场景现在不起作用,因为画廊模块根据 Settings.xml 文件中的设置向所有用户显示一个画廊,所以我现在要做的是在查询字符串中传递 galleryid -- gallery.aspx?galleryid =5 并找到将其注入 Settings.XML 文件的方法。
  • @Alaaddin,考虑到这种情况,我不知道有一种很好的方法可以将所需的值注入您的程序集中,而无需重新编写它以适应您的目标。您显然对程序集内部发生的事情有所了解,修改它的障碍是什么?
  • @cos-callis,我从一年前开始制作这个 DLL,但我丢失了最新的源代码副本,现在我想根据这个新逻辑再次使用它(GalleryID 动态不是静态的)
  • @Alaaddin,我相信你最好的(也许是“唯一”)选择是返工你的程序集,并将其归结为关于为什么硬编码的“经验教训”价值观。 (如果您找不到原件,请再上一课关于源代码控制价值的课程) 我敢说,我们这里没有一个人没有吸取过一些教训'艰难的方式'。
  • @cos-callis,感谢您的建议和帮助,
【解决方案2】:

在进程内数据库中完成这不是更好吗?

您向我解释说您将拥有许多不同的画廊。这样,有了这么多动态数据,我认为您最好使用诸如SQL Server Compact 之类的进程内数据库,并且可以使用Entity Framework 代码轻松完成。首先,从NuGet 获取包裹。如果您可以控制您的数据源,我会亲自走这条路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2011-03-03
    • 2011-09-10
    相关资源
    最近更新 更多