【发布时间】:2015-03-22 23:31:40
【问题描述】:
我有一个数据库,其中有大量等待更新的 XML 文件。该更新将擦除数据库中的所有文件。除了属性值之外,每个新文件都与之前的文件相同。
但我想保留 type 的每个属性 session 作为值。该属性在每个文件中多次出现。但是,它暂时不起作用:属性根本不会更新)。
如何更改与另一个相同的新 XML 文件中特定属性的值?
这就是我到目前为止所做的......
所以我决定找到一种方法,在擦除之前使用此代码为每个文件获取这些属性的路径:
List<XmlList> dBPathTypeSession = new List<XmlList>();
/*reader*/
XmlDocument doc = new XmlDocument();
doc.LoadXml(sessionType.Parameters);
XmlNode root = doc.DocumentElement;
//I think my problem come from this line below
XmlNodeList nodes = root.SelectNodes("//node()[@type='session']");
dBPathTypeSession.Add(new XmlList("b_session_type", i, nodes));//table,row,paths
这行下面的代码可能不需要回答我的问题,这只是更详细的。
然后在更新后更正属性值:
XmlDocument doc = new XmlDocument();
doc.LoadXml(sessionType.Parameters);
foreach (XmlNode node in file.Paths)//XmlList file = new XmlList();
{
if (node.Attributes["type"].Value == "system")
{
node.Attributes["type"].Value = "session";
}
}
//push to DB
每个文件中每个路径的信息都包含在以下内容中:
//But I think this is pointless for my question
public class XmlList
{
public XmlList(string tablePath, int filePath, XmlNodeList paths)
{
this.TablePath = tablePath;
this.FilePath = filePath;
this.Paths = paths;
}
public string TablePath {get; private set;}
public int FilePath {get; private set;}
public XmlNodeList Paths {get;set;}
}
我正在使用 C# 3.0(.NET framework 3.5),我必须使用 XMLDocument 以使其与代码中的其他所有内容相匹配。
以下是更新前XML 的示例(短版)
<Session is_hidden="false">
<ID is_static="true">1</ID>
<SESSIONIDX is_static="true">0</SESSIONIDX>
<Timing>
<FirstPresentation display_name="FirstPresentation" type="system"/>
<Pause display_name="Pause" type="system" datatype="float"/>
<Feedback display_name="Feedback" type="session" datatype="float"/>
<Answer display_name="Answer" type="system" datatype="float"/>
</Timing>
<Balls>
<Indexed display_name="Indexed" type="session" datatype="pos_int"/>
<IndexingColor1 display_name="IndexingColor1" type="system" datatype="list">
<list>
<ListItem>RED</ListItem>
<ListItem>BLUE</ListItem>
</list>
</IndexingColor1>
</Balls>
</Session>
以下是更新后XML 的示例(短版)
<Session is_hidden="false">
<ID is_static="true">1</ID>
<SESSIONIDX is_static="true">0</SESSIONIDX>
<Timing>
<FirstPresentation display_name="FirstPresentation" type="session"/>//system change for session
<Pause display_name="Pause" type="system" datatype="float"/>
<Feedback display_name="Feedback" type="system" datatype="float"/>//session change for system
<Answer display_name="Answer" type="system" datatype="float"/>//system stay system
</Timing>
<Balls>
<Indexed display_name="Indexed" type="session" datatype="pos_int"/>//session stay session
<IndexingColor1 display_name="IndexingColor1" type="system" datatype="list">
<list>
<ListItem>RED</ListItem>
<ListItem>BLUE</ListItem>
</list>
</IndexingColor1>
</Balls>
</Session>
这是我正在寻找的XML 的示例:
<Session is_hidden="false">
<ID is_static="true">1</ID>
<SESSIONIDX is_static="true">0</SESSIONIDX>
<Timing>
<FirstPresentation display_name="FirstPresentation" type="session"/>//system stay session
<Pause display_name="Pause" type="system" datatype="float"/>
<Feedback display_name="Feedback" type="session" datatype="float"/>//session return session
<Answer display_name="Answer" type="system" datatype="float"/>//system stay system
</Timing>
<Balls>
<Indexed display_name="Indexed" type="session" datatype="pos_int"/>//session stay session
<IndexingColor1 display_name="IndexingColor1" type="system" datatype="list">
<list>
<ListItem>RED</ListItem>
<ListItem>BLUE</ListItem>
</list>
</IndexingColor1>
</Balls>
</Session>
如果我们将其与布尔代数进行比较,我们会得到:
对于 x = 会话 & y = 系统
更新前 = 更新后 -> 我们想要什么
x = x -> x
x = y -> x
y = x -> x
y = y -> y
如果您需要更多信息,请在评论中提问,我会更新帖子。
【问题讨论】:
-
这在我不更新
XML时有效。我认为问题来自SelecNodes -
你能发一个 XML 的例子吗?
-
您修改 XmlNode 属性的代码在理论上是正确的。在进行修改后,您可以通过
Debug.WriteLine(doc.DocumentElement.OuterXml)在调试器中看到这一点。因此,要么您的 XPath 查询不起作用,要么 XML 不是您所想的那样,或者您的“推送到数据库”不起作用。如果您向我们展示 XML,我们可能会提供更多帮助。
标签: c# .net xml xmldocument